【发布时间】:2015-07-18 09:12:00
【问题描述】:
我是这个论坛的新手,想问一个问题。我见过很多人就字谜提问,但我的问题与这个特定的算法有关。我看到这个算法使用递归技术来生成字谜,但该算法的一部分对我来说不是很清楚。我想就为什么要采取这一特定步骤寻求帮助。该算法大纲来自 Programming Interview Exposed。这是算法:
如果你超过了最后一个位置
打印字符串并返回
否则
对于输入字符串中的每个字母
如果标记为已使用,请跳至下一个字母
否则将字母放在当前位置
- 标记使用的字母
- 置换盯着当前位置的剩余字母+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??
}
}
代码解释中提到,当递归调用返回时,只是通过减小缓冲区大小来丢弃最后一个字符。我无法理解为什么我们要删除最后一个字符?有人可以请指导。谢谢!!!!!!
【问题讨论】:
-
哇,这个算法比我以前看到的字谜检查要复杂得多。我习惯看到“将两个单词拆分为字母并对其进行排序,如果结果匹配,则两者是字谜”。
-
我认为这是字谜生成算法而不是检查:)