我是这个论坛的新手,想问一个问题。我看到许多人在问变位词的问题,但我的问题与这个特定的算法有关。我看到了这个使用递归技术生成变位词的算法,但其中的一部分对我来说不太清楚。我想寻求帮助,了解为什么要采取这个特定的步骤。这个算法大纲来自《编程面试揭秘》。以下是这个算法:
在代码说明中提到,当递归调用返回时,通过减少缓冲区大小来简单地删除最后一个字符。我不明白为什么我们要删除最后一个字符?有人可以指导一下吗?谢谢!!!
如果您已经过了最后一个位置
打印字符串并返回
否则
对于输入字符串中的每个字母
如果它被标记为使用过,则跳过下一个字母
否则将该字母放在当前位置
- 标记该字母已使用
- 从当前位置+1开始排列剩余字母
- 将该字母标记为未使用
以下是相同的代码:
void permute(String str){
int length = str.length();
boolean[] used = new boolean[length];
StringBuffer out = new StringBuffer();
char[] in = str.toCharArray();
doPermute(in, out, used, length, 0);
}
void doPermute(char[] in, StringBuffer out, boolean[] used, int length,
int level){
if (level == length){
System.out.println(out.toString());
return;
}
for (int i = 0; i<length; i++){
if (used[i]) continue;
out.append(in[i]);
used[i] = true;
doPermute(in, out, used, length, level + 1);
used[i] = false;
out.setLength(out.length() - 1); // why are we reducing the size of out??
}
}
在代码说明中提到,当递归调用返回时,通过减少缓冲区大小来简单地删除最后一个字符。我不明白为什么我们要删除最后一个字符?有人可以指导一下吗?谢谢!!!