我遇到了
THIS帖子,其中非常努力地解释了打印所有字符串的递归解决方案.
public class Main {
private static void permutation(String prefix, String str){
int n = str.length();
if (n == 0)
System.out.println(prefix);
else {
for (int i = 0; i < n; i++)
permutation(prefix + str.charAt(i),
str.substring(0, i) + str.substring(i+1));
}
}
public static void main(String[] args) {
permutation("", "ABCD");
}
}
但是当我们开始弹出堆栈时,我仍然无法获得该部分.例如,递归一直持续到置换(“ABCD”,“”),其中基本情况遇到并且它打印ABCD.但现在发生了什么?我们从函数调用堆栈中弹出置换(“ABC”,“D”)..我们用这个做什么等等.
请有人帮忙解释一下.
另外,我需要一些关于时间复杂性的指针吗?不像完整的计算,但有一些提示.
最佳答案 更简单的例子:置换(“”,“ABC”),将空字符串表示为*:
* ABC + A BC + AB C - ABC *
| |
| ` AC B - ACB *
|
+ B AC + BA C - BAC *
| |
| ` BC A - BCA *
|
` C AB + CA B - CAB *
|
` CB A - CBA *
请注意,这看起来就像一棵树.实际上,它叫一棵树.当我们开始时,我们将进入(“A”,“BC”)状态;我们继续打电话(“AB”,“C”),最后(“ABC”,“”).在这里我们打印输出.然后我们记得我们有未完成的业务,我们返回循环,但上一级的循环只有一个循环.所以我们也在那里完成,并返回(“A”,“BC”)级别; “BC”中有两个元素,我们只完成了“B”,所以它现在是“C”轮流:我们称之为(“AC”,“B”),然后调用(“ACB”,“ “).现在所有的循环(“A”,“BC”)都已完成……但是等等,仍然可以做!因为(“”,“ABC”)还有两个要处理的字母.所以它逐个分支,在我们通常所说的“深度优先搜索”中.
在每个级别是一个循环.循环收缩(我们在左侧的粗分支中迭代3次,然后在下一级中迭代2次,然后只有一次)但仍然存在循环.总的来说,我们做n *(n – 1)*(n – 2)* … * 2 * 1次迭代.上!)?