我必须编写一个应该测试的代码,如果一个字符串是另一个字符串的字谜。但是我的代码不起作用。我每次都会得到错误的结果。谁能解释我的错误在哪里?
public boolean anagram (String s1, String s2) {
count = 0;
for(int i = 0; i !=-1; i++) {
if(s1.indexOf(s2.charAt(i)) != -1) {
count++;
temp = Integer.toString(s1.indexOf(s2.charAt(i)));
s1.replace(temp,"");
} if(count+1 == s1.length())
return a == true;
}
return a == false;
答案 0 :(得分:1)
尝试这样的事情:
public boolean anagram (String s1, String s2) {
int count = 0;
boolean a = false;
for (int i = 0; i < s2.length(); i++) {
int s1index = s1.indexOf(s2.charAt(i));
if (s1index != -1) {
count++;
s1 = s1.replaceFirst(String.valueOf(s1.charAt(s1index)),"");
}
}
if ((count == s2.length()) && (s1.length() == 0))
a = true;
return a;
}
基本上,测试应该在函数的末尾和for
循环之外完成,并且您想返回布尔值a
,而不是布尔值{{1 }}(应始终为a == true
,因为在代码中从未为false
分配a
值)。
编辑:我已经纠正了最初答案中的两个错误,并添加了代码,有望消除字母多次出现的问题(这就是为什么我的第一个答案在某些情况下不起作用的原因)。这段代码修改了true
字符串-如果您不希望这样做,只需在函数开始处执行s1
,然后将s1temp = s1;
替换为s1
即可。功能。该代码还使用了字符串的s1temp
方法-据我所知,replaceFirst()
方法会删除字母的所有出现,但是您可以切换到其他删除字符的方法从字符串中获取(有关更多详细信息,请参见this question)。顺便说一下,您的replace
方法错误地尝试替换字符的 index 而不是实际字符,更不用说temp
测试没有意义的事实在i !=-1
从0开始递增的for
循环中。
注意:您可以验证它是否正在运行(屏幕上显示了每个步骤)here(在线Java编译器)。
答案 1 :(得分:1)
我的解决方案不修改不可变的Strings
(即创建新的修改后的字符串实例)和大小为26的临时数组:
public static boolean isAnagram(String one, String two) {
one = one != null ? one.toLowerCase() : "";
two = two != null ? two.toLowerCase() : "";
if (one.length() != two.length())
return false;
int[] arr = new int[26];
for (int i = 0; i < one.length(); i++)
arr[one.charAt(i) - 'a']++;
for (int i = 0; i < two.length(); i++)
arr[two.charAt(i) - 'a']--;
for (int ch : arr)
if (ch != 0)
return false;
return true;
}