我正在创建算法来检查两个给定的单词是否是 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/