【劍指Offer學習】【面試題28 :字串的排列】
阿新 • • 發佈:2019-01-06
題目:輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc。則打印出由字元a、b、c 所能排列出來的所有字串abc、acb、bac 、bca、cab 和cba 。
解題思路:
把一個字串看成由兩部分組成:第一部分為它的第一個字元,第二部分是後面的所有字元。在圖4.14 中,我們用兩種不同的背景顏色區分字串的兩部分。
我們求整個字串的排列,可以看成兩步:首先求所有可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換。圖4.14 就是分別把第一個字元a 和後面的b、c 等字元交換的情形。首先固定第一個字元(如圖4.14 (a )所示〉,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分:後面字元的第一個字元,以及這個字元之後的所有字元。然後把第一個字元逐一和它後面的字元交換(如圖4.14 (b)所示)。。。。。。
這其實是很典型的遞迴思路。
程式碼實現:
public class Test28 {
/**
* 題目:輸入一個字串,打印出該字元事中字元的所有排列。例如輸入字串abc。
* 則打印出由字元a、b、c 所能排列出來的所有字串abc、acb、bac、bca、cab和cba。
*
* @param chars 待排序的字元陣列
*/
public static void permutation(char[] chars) {
// 輸入較驗
if (chars == null || chars.length < 1 ) {
return;
}
// 進行排列操作
permutation(chars, 0);
}
/**
* 求字元陣列的排列
*
* @param chars 待排列的字串
* @param begin 當前處理的位置
*/
public static void permutation(char[] chars, int begin) {
// 如果是最後一個元素了,就輸出排列結果
if (chars.length - 1 == begin) {
System.out.print(new String(chars) + " ");
} else {
char tmp;
// 對當前還未處理的字串進行處理,每個字元都可以作為當前處理位置的元素
for (int i = begin; i < chars.length; i++) {
// 下面是交換元素的位置
tmp = chars[begin];
chars[begin] = chars[i];
chars[i] = tmp;
// 處理下一個位置
permutation(chars, begin + 1);
}
}
}
public static void main(String[] args) {
char[] c1 = {'a', 'b', 'c'};
permutation(c1);
System.out.println();
char[] c2 = {'a', 'b', 'c', 'd'};
permutation(c2);
}
}