我写了一种算法来解决字符串置换算法。它有问题,在某个地方打印错误的输出。对于不同的输入,我已经多次遍历代码,但是我找不到我犯了什么错误。
有人会解释我在哪里犯了错误吗?
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茶
我也尝试调试。我发现调试起来太麻烦了,因为涉及到递归。
答案 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;
}
}