我无法掌握此字符串排列代码的工作方式。我知道它是如何将字符从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));
}
}
}
答案 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()));
}