字串的全排列

2021-10-04 04:28:47 字數 1383 閱讀 1905

題目描述

輸入乙個字串,列印出該字串中字元的所有排列。

例如輸入字串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放到第一位置,...