我没有发现我的代码错误来检查字串的字谜

时间:2018-12-12 17:03:27

标签: java string anagram

我必须编写一个应该测试的代码,如果一个字符串是另一个字符串的字谜。但是我的代码不起作用。我每次都会得到错误的结果。谁能解释我的错误在哪里?

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;

2 个答案:

答案 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;
}