我正在尝试这个问题http://www.geeksforgeeks.org/print-all-combinations-of-given-length/但是我不明白它的某些部分。我已经提到了我打印的控制台输出的一部分来调试程序。在这里我不明白,在打印'aaa'之后,当k == 0时为什么前缀再次为aa它应该是'aaa',因为它打印了'aaa'。
console.txt
i is0Prefix is New Prefix isa n is2 K is 2
i is0Prefix isa New Prefix isaa n is2 K is 1
i is0Prefix isaa New Prefix isaaa n is2 K is 0
aaa
i is1Prefix isaa New Prefix isaab n is2 K is 0
StringPermutation .java
class StringPermutation {
// Driver method to test below methods
public static void main(String[] args) {
System.out.println("First Test");
char set1[] = {'a', 'b'};
int k = 3;
printAllKLength(set1, k);
System.out.println("\nSecond Test");
char set2[] = {'a', 'b', 'c', 'd'};
k = 1;
printAllKLength(set2, k);
}
// The method that prints all possible strings of length k. It is
// mainly a wrapper over recursive function printAllKLengthRec()
static void printAllKLength(char set[], int k) {
int n = set.length;
printAllKLengthRec(set, "", n, k);
}
// The main recursive method to print all possible strings of length k
static void printAllKLengthRec(char set[], String prefix, int n, int k) {
// Base case: k is 0, print prefix
if (k == 0) {
System.out.println(prefix);
return;
}
// One by one add all characters from set and recursively
// call for k equals to k-1
for (int i = 0; i < n; ++i) {
// Next character of input added
//System.out.println("prefix is"+prefix);
String newPrefix = prefix + set[i];
System.out.println("i is"+i+"Prefix is"+prefix+" "+"New Prefix is"+newPrefix+" "+"n is"+n+" "+ "K is "+(k-1));
printAllKLengthRec(set, newPrefix, n, k - 1);
}
}
}
答案 0 :(得分:0)
这是递归的棘手问题。您正在为每个n
执行for
循环的prefix
次迭代。在完成所有剩余的迭代之前,你需要深入研究一个底部。
每次循环使用新的前缀调用printAllKLengthRec
,它会尝试将set
中的每个字母添加到该前缀并继续运行,直到它得到一个适当长的字符串,此时它停止尝试添加新的字母,并将添加set
中的下一个字母,直到没有更多的信息在该级别上尝试。然后你将放松到上一个级别并且#34;完成&#34;那个通过使用set
中的下一个字母并尽可能深地构建字符串。我将尝试将prefix
的值表示为下面的树,以便您可以看到当您一直到达一个&#34; leaf&#34;你回到分支机构并尝试下一个值:
''
a
aa
aaa
aab
ab
aba
abb
b
ba
baa
bab
bb
bba
bbb
因此,在您打印aaa
后,您无法再降低{@ 1}},所以您回到aa
的位置并从set
中选择下一个字母然后尝试,然后继续回到树上,直到找到你可以尝试的另一件事。
树中每个缩进级别都是printAllKLengthRec
中的递归深度。我们从0开始,然后是1,然后是2,然后是3,然后是3,然后再回到2。 。等等,直到我们查看了此set
和k
的所有案例。当我们回到某个级别时,我们回到了prefix
之前的位置,然后我们做了上一个不错的事情,所以我们只需添加一个从set
到prefix
的另一个字母并再次开始下降