忘记了此字符串排列代码的工作原理吗?

时间:2018-11-17 23:07:53

标签: java recursion

我无法掌握此字符串排列代码的工作方式。我知道它是如何将字符从str移到前缀的,但是当我跟踪它的工作方式时,我完全感到困惑,它将如何进入下一个排列。

例如单词“小块”

其输出为字符串前缀+“” +字符串str

小块

cubs

cu bs

cub s

小块<----------我了解它如何到达这里

cu bs <----------我不知道它如何从这里开始备份?

public static void main(String[] args) {

        permutation("cubs");        
    }

    public static void permutation(String str) {
        permutation("", str);
    }

    public 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++) {
                System.out.println(prefix + " " + str);

                permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));               
            }
        }

    }

2 个答案:

答案 0 :(得分:0)

不确定是否正确解释了您的问题。我想您想知道为什么要有这个副本,对吗?而且我还假定您不只是想要一个可行的解决方案,因为您可能想自己解决问题,对吗?

在for循环中,您打印出某些内容,在某些情况下,当递归调用permutation时,该内容将再次打印出来。

您在循环中打印的事实很可能会导致这种情况。如果您仅在循环(if (some condition) print(this); else print that)之外打印,则可以避免重复。

实际上,您可能不想在else部分中打印任何内容。

答案 1 :(得分:0)

好,让我看看是否可以为您解释。想到递归的最佳方法是将其视为层次结构-每个嵌套调用都在层次结构中向下一层。

因此,当您使用“”,“ cubs”调用烫发时,它将依次调用以下内容:

c,ubs
u,cbs
b,cus
s,cub

如果您考虑第一个调用“ c”,“ ubs”,它将调用:

cu,bs
cb,us
cs,ub

第一个“ cu”,“ bs”将以args调用:

cub,s
cus,b

第一个“ cub”,“ s”将以args调用:

cubs,

现在第二个参数字符串的长度为0,因此没有更深的递归。

将c,ubs的整个层次结构放在一起

,cubs
    c,ubs
        cu,bs
            cub,s
                cubs,
            cus,b
                cusb,
        cb,us
            cbu,s
                cbus,
            cbs,u
                cbsu,
        cs,ub
            cus,b
                cusb,
            cub,s
                cubs,
    u,cbs
        ...

希望您能依次看到每种组合的工作原理。

您具体询问了它是如何从“ cu bs”开始的。这样做的原因是您在每次迭代中都打印prefix + " " + str,因此它将在每次递归调用之前打印相同的文本3次。如果要跟踪递归,则在调用开始时打印一次可能更有意义。函数主体中的以下内容可能会给出更有意义的输出:

System.out.println(prefix + " " + str);
for (int i = 0; i < str.length(); i++) {
    permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, str.length())); 
}