【问题标题】:My String Permutations algorithm doesn't work我的字符串排列算法不起作用
【发布时间】:2018-07-24 10:44:40
【问题描述】:

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

有人能解释一下我在哪里犯了错误吗?

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

但正确的输出是

吃茶吃茶

我也尝试过调试。我发现调试太难了,因为涉及到递归。

【问题讨论】:

  • @NiVeR 输出缺少aetate

标签: java string algorithm permutation


【解决方案1】:

你应该恢复递归的原始状态,否则你会不断混淆给定的参数。函数参数“strstartind”仅表示要选择的正确字符,如果原始“str[]”没有更改,但是您在以下位置覆盖原始“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;
}
}

【讨论】:

  • 谢谢。它运作良好。我理解你的观点,但你能否通过以“吃”字符串为例来解释我的方法中的错误,其中这种不恢复的方法面临问题。
  • “不恢复方法”是您方法中的一个普遍问题。它与您选择的示例无关。
  • 我知道。但我要求您以“吃”字符串为例,并解释问题出在哪里。
  • @Lukas-Franken 通过添加额外描述编辑了我的答案
  • @Lukas-Franken 我正在更改我的原始字符串。很好,但是这些发生在不同的函数调用中。他们不应该影响我的函数局部变量 str 对吗?这就是我要问的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
相关资源
最近更新 更多