更快的字符串排列

时间:2012-06-09 16:38:15

标签: java string performance permutation factorial

我有排列方法

public void permute(String str) {
    permute(str.toCharArray(), 0, str.length() - 1);
}

private void permute(char[] str, int low, int high) {
    if (low == high) {
        writeIntoSet(new String(str, 0, length));
    } else {
        for (int i = low; i <= high; i++) {
            char[] x = charArrayWithSwappedChars(str, low, i);
            permute(x, low + 1, high);
        }
    }
}

private char[] charArrayWithSwappedChars(char[] str, int a, int b) {
    char[] array = str.clone();
    char c = array[a];
    array[a] = array[b];
    array[b] = c;
    return array;
}

但是当我把10个字母长度的字符串放入这个方法时,它会产生10个!组合,需要很多时间。有没有可能如何让它更快?

修改

我需要用10个字母进行排列,但在那之后,我在字典中搜索这些“单词”。例如,我有 - CxRjAkiSvH,我需要单词CAR,CARS,CRASH等。是否有任何性能选项?

2 个答案:

答案 0 :(得分:1)

现有的用于生成排列的算法可能比您使用的排列更有效,因此您可以查看one of those。我过去使用过Johnson-Trotter算法,通过使每次最小变化可以获得下一个排列,可以略微提高速度。我不知道你必须在哪种约束下工作,但如果你不必使用Java,最好不要这样做。它根本不会是最快的。特别是如果您的算法使用递归。正如其他人所建议的那样,如果您坚持使用此算法,最好放弃递归方法并尝试使用循环。

答案 1 :(得分:0)

对于10个字符的字符串,有10个字符!排列,没有两种方法可以解决这个问题。您可以通过添加StringBuffer代替手动使用char[]或者手动使用{{1}}来提高速度。