我正在创建算法以检查两个给定的单词是否是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;
}
}
答案 0 :(得分:1)
这个解决方案是错误的 - 求和值会丢失大量数据,特别是值的分布方式。例如,如果你喂养&#34; AC&#34;和&#34; BB&#34;对于此功能,您将获得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()));
}
答案 1 :(得分:1)
这不起作用,因为ac
等于bb
。
您需要实际跟踪角色:
int[] aArr = new int[26];
int[] bArr = new int[26];
for(char c : a. toLowerCase().toCharArray()) {
aArr[c - 'a']++;
}
// same for b
return Arrays.equals(aArr, bArr);
时间复杂度为O(n)
(带长度检查)
答案 2 :(得分:1)
将字符串转换为char数组,并使用Arrays.sort()对它们进行排序
String str1 = "anagram";
String str1 = "margana";
char arrChar1[]= str1.toLowerCase().toCharArray();
char arrChar2[]= str2.toLowerCase().toCharArray();
Arrays.sort(arrChar1);
Arrays.sort(arrChar2);
System.out.println(Arrays.equals(arrChar1,arrChar2));//check if is equals with char to char
//if true is anagram if false is not