【问题标题】:Lost how this string permutation code works?忘记了这个字符串排列代码是如何工作的?
【发布时间】:2019-04-20 17:41:39
【问题描述】:

我无法理解这个字符串排列代码是如何工作的。我知道它是如何将字符从 str 移动到前缀的,但是当我追踪它是如何工作的时,我完全不知道它是如何进入下一个排列的。

例如单词“cubs”

它的输出是字符串前缀 + " " + String str

幼崽

c ubs

cu bs

幼崽

小熊们

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));               
            }
        }

    }

【问题讨论】:

  • 尝试看看递归是如何工作的。这可能是你错过的。也许这可以给你一些线索en.wikipedia.org/wiki/…

标签: java recursion


【解决方案1】:

好的,让我看看能否为您解释一下。考虑递归的最好方法是将其视为一个层次结构——每个嵌套调用都是层次结构中的下一层。

所以当你用 "","cubs" 调用 perm 时,它会依次调用以下内容:

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())); 
}

【讨论】:

  • 感谢您的评论,我会尝试更改,看看我是否能更理解这一点。
  • 所以在前缀是 cubs 并且 str 是 " " 之后,我还是不明白它是如何变成 cus,b 的,除非它回来兜售。
  • 所以如果我理解这一点,在 str 变为 0 后,它会移回之前的层次结构?
  • @YachtRocker 是的,这是正确的。这就是递归的工作原理。在 str 长度为 0 时,它会弹出函数
【解决方案2】:

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

在您的 for 循环中,您打印的内容在某些情况下会在递归调用 permutation 时再次打印。

您在循环中打印的事实很可能会发生这种情况。如果您只在循环外打印 (if (some condition) print(this); else print that),您可以更轻松地避免重复。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2015-10-26
    • 2019-10-17
    • 1970-01-01
    • 2015-12-13
    • 2010-12-13
    相关资源
    最近更新 更多