2字的字谜

时间:2014-01-06 12:05:34

标签: java quicksort anagram

我正在练习java和一些算法,所以我想创建一个程序来查看2个单词是否是彼此的字谜。我的方法是使用快速排序对单词进行排序,然后查看它们是否匹配。我测试了我quicksort功能,它似乎工作。也许我的字谜功能错了?我针对"tac""cat"测试了我的代码,我得到了false

有人可以查看我的代码,看看我哪里出错了吗?

我的代码:

public static boolean anagram(String s, String t) {
    int lenS = s.length();
    int lenT = t.length();
    if (lenS != lenT) {
        return false;
    }
    else if (quicksort(s) == quicksort(t)) {
            return true;
    }
    else { return false;}
}

public static String quicksort(String s) {
    int len = s.length();
    int median = len/2;     //pivot point
    String sortedString;
    if (len < 2) {
        return s;
    }
    else {
        String str = s.replace(String.valueOf(s.charAt(median-1)), "");
        char pivot = s.charAt(median-1);
        String less = "";
        String greater = "";
        for (int i = 0; i < str.length(); i++) {
            char pointed = str.charAt(i);
            if (pointed <= pivot) {
                less += String.valueOf(pointed);
            }
            else {
                greater += String.valueOf(pointed);
            }
        }
        sortedString = quicksort(less) + pivot + quicksort(greater);
        return sortedString; 
    }
}

2 个答案:

答案 0 :(得分:2)

quicksort(s) == quicksort(t)

您的问题存在 - 您将字符串与==进行比较,而不是.equals()!你不应该使用==来比较字符串,除了愚蠢的学术例子。它是错误和不可预测行为的支柱。有时候它会起作用,但大部分时间它都不会起作用(请参阅here以获得有关该主题的更深入解释,但实际上,带字符串的规则只是“始终使用equals(),绝不使用{{ 1}}。)

因此,if语句中的条件应为==

顺便说一下,您可以绕过整个quicksort(s).equals(quicksort(t))方法,只需使用quicksort()(在对字符串调用Arrays.sort()之后)。通常,使用库排序总是更好编写自己的排序方法,虽然我知道有必要的家庭作业等等!

答案 1 :(得分:1)

我一直在考虑使用quicksort来解决字谜,并认为我有一条捷径。如果我们同时使用快速排序处理这两个单词,我们可以比较每次迭代时的数据透视索引。在一天结束时,我们试图尽可能避免完成2个快速入口。使用这种方法,我们使用数据透视索引作为完成结果的预览。

例如,在迭代1中,快速排序1的枢轴索引最终位于位置4,值为“a”,快速排序2的枢轴索引最终位于位置6,值“c”我们无法使用快捷方式(尚)。

然而,在迭代1中说,快速排序1的枢轴索引最终位于位置4,值为“c”,快速排序2的枢轴索引最终位于位置6,值为“a”然后我们可以确定它们不会是字谜。

我们可以在每次迭代的整个比较过程中继续使用这种方法。

这应该将比较效率从“2n log(n)”改为“n log(n)/ 2”(400%性能提升)。