我的字符串排列算法不起作用

时间:2018-07-24 10:44:41

标签: java string algorithm permutation

我写了一种算法来解决字符串置换算法。它有问题,在某个地方打印错误的输出。对于不同的输入,我已经多次遍历代码,但是我找不到我犯了什么错误。

有人会解释我在哪里犯了错误吗?

public static void main(String args[]) throws Exception {

    String str1 = "eat";
    int len = str1.length();
    char[] str = str1.toCharArray();
    recurPerm(str,0,len);
}
static void recurPerm(char[] str, int strstartind, int sz) {

    for(int i = strstartind; i < sz; i++){
        if(i > strstartind) {

            char temp = str[strstartind];
            str[strstartind] = str[i];
            str[i] = temp;

            recurPerm(str, strstartind + 1, sz);
        }
        else {
            recurPerm(str, strstartind + 1, sz);
        }
    }
    if(strstartind >= sz){
        System.out.println(str);
    }

    return;
}

输出

eat
eta
tea 
tae
eat
eta

但是正确的输出是

  

吃eta ate tae茶

我也尝试调试。我发现调试起来太麻烦了,因为涉及到递归。

1 个答案:

答案 0 :(得分:3)

您应该恢复递归的原始状态,否则您将混淆给定的参数。如果原始的“ str []”未更改,则函数参数“ strstartind”仅指示要选择的正确字符,但是您可以在以下位置覆盖原始的“ str []”:

    str[strstartind] = str[i];
    str[i] = temp;

这是一个可行的解决方案,用于还原递归参数:

public class DemoApplicationTests {

public static void main(String args[]) throws Exception {

    String str1 = "eat";
    int len = str1.length();
    char[] str = str1.toCharArray();
    recurPerm(str, 0, len);
}

static void recurPerm(char[] str, int strstartind, int sz) {

    for (int i = strstartind; i < sz; i++) {
        char temp = str[strstartind];
        str[strstartind] = str[i];
        str[i] = temp;
        recurPerm(str, strstartind + 1, sz);
        //restore state
        str[i] = str[strstartind];
        str[strstartind] = temp;
    }
    if (strstartind >= sz) {
        System.out.println(str);
    }

    return;
}
}