1. 程式人生 > >【劍指Offer學習】【面試題28 :字串的排列】

【劍指Offer學習】【面試題28 :字串的排列】

題目:輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串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); } }

執行結果:

這裡寫圖片描述