在Java中使用递归的字符串排列

我遇到了
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次迭代.上!)?

点赞