查找字符串中的重复字符

时间:2019-11-19 07:19:57

标签: java string

例如,如果字符串输入为:duplicate的输出应为"aabacdceefeg",我试图在字符串中打印a-->3,b-->1,c--->2,e-->3字符,就像这种方式必须打印值,但下面的代码不起作用这种逻辑可以有人建议我

  public class Test {

        public static void main(String[] args) {
             String string1 = "Great responsibility";
      char string[] = string1.toCharArray();
      HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
      for (int i = 0; i < string.length; i++) {
          for (int j = i + 1; j < string.length; j++) {
              if (string[i] == string[j]) {
                 Integer value = hashMap.get(string[i]);
                 hashMap.put(string[i], value+1);
              } else {
                  hashMap.put(string[i], 1);
              }
          }
      }
      System.out.println(hashMap);
    }

   }

6 个答案:

答案 0 :(得分:1)

您可以通过直接使用hashMap并仅使用一个循环来简化它

    String string1 = "Great responsibility";

    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (Character c : string1.toCharArray()) {

        if (hashMap.containsKey(c)) {
            int val  = hashMap.get(c);
            hashMap.put(c, val + 1);
        }
        else {
            hashMap.put(c, 1);
        }
    }
    System.out.println(hashMap);

输出

{ =1, a=1, b=1, e=2, G=1, i=3, l=1, n=1, o=1, p=1, r=2, s=2, t=2, y=1}

答案 1 :(得分:1)

如何优化解决方案有很多答案,但是没有任何一个方法可以说明如何修复原始的[key1,value1,value2]时间复杂度解决方案。

这是原始解决方案中要解决的问题(除了效率低下外)

  1. 如果地图中尚不存在字符,则应将O(N^2)设置为value,因为这是第一次出现。
  2. 如果当前字符不等于另一个字符,则保留其原始计数。

固定代码如下:

1

答案 2 :(得分:0)

您只需要一级循环:

    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for (int i = 0; i < string.length; i++) {
        Integer count = map.get(string[i]);
        if (count == null) {
            map .put(string[i], 1);
        } else {
            map .put(string[i], count+1);
        }
    }

答案 3 :(得分:0)

首先创建一个字符列表,然后遍历所需的字符串。

ArrayList<Character> charList=new ArrayList();
charList.clear();

for (int i = 0; i < string.length; i++) {

if(!charList.Contains(string[i])){
charList.add(string[i]))
}

 }

    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (Char char:charList) {
      count=0;
        for (int j = i + 1; j < string.length; j++) {
            if (char == string[j]) {
                hashMap.put(char, count++);
            } 
        }
    }
    System.out.println(hashMap);
}

答案 4 :(得分:0)

    String string1 = "Great responsibility";
    char[] chars = string1.toCharArray();

    Map<Character, Integer> map = new HashMap<>();
    for(char c : chars) 
    {
        if(map.containsKey(c)) {
            int counter = map.get(c);
            map.put(c, ++counter);
        } else {
            map.put(c, 1);
        }
    }

我希望它能对您有所帮助。

答案 5 :(得分:0)

您还可以使用 Java8 lambda函数来解决该问题。您只需将String转换为count映射即可。

    String string1 = "aabacdceefeg";
    Map<Character,Long> countMap = string1.chars().mapToObj(i -> (char)i).collect(
            Collectors.groupingBy(Function.identity(), Collectors.counting())
        );
    System.out.println(countMap);