題目描述
輸入乙個字串,列印出該字串中字元的所有排列。
例如輸入字串abc,則輸出由字元a、b、c 所能排列出來的所有字串
abc、acb、bac、bca、cab 和 cba。
從集合中依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做:以abc為例
固定a,求後面bc的排列:abc,acb,求好後,a和b交換,得到bac
固定b,求後面ac的排列:bac,bca,求好後,c放到第一位置,得到cba
固定c,求後面ba的排列:cba,cab。
//dfs實現全排列
void
dfs(
char
* perm,
int from,
int to)
if(from == to)
else
}}
從字串的最後乙個位置開始向第乙個位置倒敘,判斷是否有公升序的相鄰字元便將它們相互交換
公升序:相鄰兩個位置ai < ai+1,ai 稱作該公升序的首位
步驟:找到公升序位置、交換
找到排列中最後(最右)乙個公升序的首位位置i,x = ai
找到排列中第i位右邊最後乙個比ai 大的位置j,y = aj
交換x,y
void
swap
(char
*a,char
*b)void
reverse
(char
*star,
char
*end)
void
per(
char a)
end--;}
if(ai==-1
)break
;//如果ai為-1便是沒有公升序的字元了
int i = ai +
1,si;
char min=
127;
while
(i} i++;}
swap
(a+ai,a+si)
;reverse
(a+ai+
1,a+end-1)
;}}
void
fun(
char a,
int n)
while
(next_permutation
(a,a+4)
);}
解法總結
由於全排列總共有n!種排列情況,所以不論解法一中的遞迴方法,還是上述解法二的字典序排列方法,這兩種方法的時間複雜度都為o(n!)。
字串的排列 全排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。使用itertools中的permutations,可以實現全排列 ...
遞迴 字串全排列 全排列
在高中階段我們已經通過大量的習題了解了排列和組合。但是有時候我們研究的不是由排列和組合算出來的數字,研究的是生成排列和組合。即,把集合中元素所有的排列和組合全部列出來,然後研究這些序列的性質。今天我用兩種方法講一下如何生成排列。注意我們這裡涉及的順序都是序列的字典序。序列的字典序 設有兩個序列,第乙...
字串全排列
依次選出每乙個字元元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理,從而得到所有元素的全排列。以對字串abc進行全排列為例,我們可以這麼做 固定a,求後面bc的排列 abc,acb,求好後,a和b交換,得到bac 固定b,求後面ac的排列 bac,bca,求好後,c放到第一位置,...