打印长度为k的所有字符串模式

时间:2016-06-09 16:56:46

标签: java string coding-style permutation

我正在尝试这个问题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); 
    }
}

}

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。 。等等,直到我们查看了此setk的所有案例。当我们回到某个级别时,我们回到了prefix之前的位置,然后我们做了上一个不错的事情,所以我们只需添加一个从setprefix的另一个字母并再次开始下降