Java Anagram - 它是除了排序之外最简单的解决方案吗

标签 java anagram

我正在创建算法来检查两个给定的单词是否是 Anagram。我想出了这个简单的解决方案。但我认为这太简单了,我找不到这个更简单的解决方案。我对这个解决方案正确吗?或者这个解决方案有什么问题?

public boolean checkAnagram(String a, String b){
    if(a.length() != b.length()) return false;
    a=a.toLowerCase();
    b=b.toLowerCase();
    int length= a.length();
    int sum1=0;
    int sum2=0;
    for(int i=0;i<length;i++){
        sum1 += a.charAt(i);
        sum2 +=b.charAt(i);
    }

    if(sum1==sum2){
        return true;
    } else {
        return false;
    }
}

最佳答案

这个解决方案是错误的 - 对值求和会丢失大量数据,特别是值的分布方式。例如,如果您向此函数输入“AC”和“BB”,您将得到 true,这是错误的结果。

相反,您应该计算每个字符在每个字符串中出现的次数并进行比较:

public static boolean checkAnagram(String a, String b){
    // optimiztion, will also work without it
    if (a.length() != b.length()) {
        return false;
    }
    Map<Character, Long> aMap = countChars(a);
    Map<Character, Long> bMap = countChars(b);
    return a.equals(b);
}

private static Map<Character, Long> countChars(String s) {
    return s.chars()
            .mapToObj(c -> Character.toLowerCase((char) c))
            .collect(Collectors.groupingBy(Function.identity(), 
                     Collectors.counting()));
}

关于Java Anagram - 它是除了排序之外最简单的解决方案吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37846143/

相关文章:

java - 丰富的选择列表 + javascript 验证

java - DOM 解析器读取 Xml、检索属性值并存储它们

javascript - JavaScript 中的字谜查找器

arrays - 这段代码是做什么的。检查两个字符串的字谜

c - 完美/理想的哈希来隔离字谜

c - C 中的 Anagram : How do I know if every element of the int array is set to zero?

java - 将数据输入到输入流中

java - Hibernate CollectionOfElements EAGER 获取重复元素

java - 部署在 Tomcat 上的 Spring Boot MVC 应用程序无法正常工作

algorithm - 为什么在 Anagram 映射中 O(n^2) 比 O(n) 快?