A. 含有重復字元的字元串排列組合
排列:從給定個數的元素中取出指定個數的元素進行排序
組合:從給定個數的元素中取出指定個數的元素,不考慮排序
排列包含了組合的過程,從給定個數的元素中取出指定個數元素(組合),然後再把取出的元素進行排序。
這意味著,我們利用組合得到組合數,然後利用組合數實現全排列,就得到了排列。
一般組合指的是取出1~n個元素的組合,因為全組合只有一個
輸入一個長度為n的字元串,輸出該字元串中字元的所有組合
如果輸入"abc",它的組合有a、b、c、ab、ac、bc、abc
①假設在長度為n的字元串中求m個字元的組合
②從頭掃描字元串的第一個字元,有兩種選擇:
(1)把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選取m-1個字元
(2)不把這個字元放到組合中去,接下來我們需要在剩下的n-1個字元中選擇m個字元
注意:所有字元取出擺放的位置都是以原來的相對位置,不改變原來的前後順序
基本思路 :求組合,表示可以取少於總字元個數的字元組合,因為全字元組合就一個,則假設輸入字元個數為n個,則最終組合結果是(2^n - 1)個。
原因 :假設字元為a,b,c,則1表示取c元素,0表示不取c。所以001表示取c,010取b,100取a,011取bc.所以一共三位,每個位上有兩個選擇0,1.所以是(2^n - 1)個結果。依次表示為: 001,010,011,100,101,110,111 。對應輸出組合結果為: a, b ,ab,c,ac,bc,abc .
注意:這個思路也非常好~ 但是前提是 字元長度不超過32個
利用hashSet實現查重:第一次放入到hashSet輸出結果,如果遇到已經在hashSet中存在,則不輸出結果
注意 :由於利用HashSet實現去重,而不是直接在演算法上實現去重,增加了空間復雜度和時間復雜度,所以不是最優演算法。關於演算法優化,有待後面繼續提高和實現!
如果網友有更好的方法,還是多多指教!
輸入一個長度為n的字元串,輸出該字元串中字元的全排列
如果輸入「abc」,則全排列為abc、acb、bac、bca、cab和cba。
①遞歸實現,每遞歸一次取一個字元作為當前輸入字元的首字元。例如,輸入「abc」,則取第一個字元「a」,把字元「a」與第一個字元「a」交換,當前不用交換。剩下的字元「bc」,下次遞歸也是這樣。如果選取的是字元「b」,則在字元數組中把字元「b」與字元「a」交換,後面選取字元就是在「ac」中選取。如果選取的是字元「c」,與字元「a」交換,下次選取就是在「ba」中選取
②每次選取後,下次遞歸則需要把交換的字元順序,重新返回。
輸入一個長度為n的字元串,字元中包含重復字元,輸出字元的全排列
如果輸入「abb」,則全排列為abb, bab, bba
參考文獻
[1] 字元串的全排列和組合
[2] 字元串排列和組合的java實現
[3] 字元串的全排列和組合演算法
[4] 帶有重復字元的字元數組的全排列
[5] java 全組合 與全排列
[6] 字元串組合——位運算
[7] java排列組合問題匯總【經典】