劍指Offer28 字串排列問題

2021-09-26 22:04:55 字數 1000 閱讀 4081

輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出字元a、b、c所能排列出來 的所有字串abc、bac、bca、cab、cba。

*      求整個字串的全排列,可以看成兩步:

* 第一步、首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換;

* 第二步、固定第乙個字元,求後面所有字元的排列。

* 這時候仍然把後面的字元分成兩部分,後面的第乙個字元,和這個字元之後的所有字元,然後把後面的第乙個字元和它後面的字元交換。

如果不是求字元的所有排列,而是求字元的所有組合,該如何解決呢?例如還是輸入三個字元abc,則它們的組合有a、b、c、ab、ac、bc、abc。當交換字串中兩個字元時,雖然能得到兩個不同的排列,如ab和ba是不同的排列,但是算乙個組合。

* 解題思路:

* 如果輸入n個字元,則這個n個字元能夠組成長度為1的組合,長度為2的組合,....,長度為n的組合。在求n個字元的長度為m(1<=m<=n)的組合的時候,我們把這n個字元

* 剩餘的n-1個字元裡選取m個字元。也就是說,我們可以把求n個字元組成長度為m的組合的問題,分解成兩個子問題,分別求n-1個字串中長度為m-1的組合,以及

* 求n-1個字元的長度為m的組合。這兩個子問題都可以用遞迴實現。

public class code028 

private static void permutation(string str)

//否則將字串轉換為字元陣列,並從0位置開始進行全排列

permutation(str.tochararray(),0);

}private static void permutation(char chars, int position)

for(int i=position;i=m;i--)}}

}

劍指offer28 字串的全排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a b c所能排列出來的所有字串abc acb bac bca cab 和cba。解法 遞迴實現 從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列。如此遞迴下去,從而得到所有字元的全排列。第一步 ...

面試題 劍指Offer 28 字串的全排列

昨天做了一套cvte的面試題,最後乙個題目就是字串的全排列。做過劍指offer的童鞋一眼就可以看出這是劍指offer 28題 原題目,一點都沒變 把字串看成兩個部分,第乙個部分為第乙個字元,剩下的是後面的字元 首先將所有可能出現在第乙個位置的字元,將這些字元在每次迴圈的時候和第乙個字元交換 先固定乙...

劍指Offer 程式設計題28(字串的排列)

把乙個字串看成由兩部分組成 第一部分為它的第乙個字元,第二部分是後面的所有字元。在圖4.14 中,我們用兩種不同的背景顏色區分字串的兩部分。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。圖4.14 就是分別把第乙個字元a 和後面的b c...