c 全排列演算法

2021-09-17 21:16:35 字數 2184 閱讀 8001

1.對於無重複值的情況

** 固定第乙個字元,遞迴取得首位後面的各種字串組合;

* 再把第乙個字元與後面每乙個字元交換,並同樣遞迴獲得首位後面的字串組合; *遞迴的出口,就是只剩乙個字元的時候,遞迴的迴圈過程,就是從每個子串的第二個字元開始依次與第乙個字元交換,然後繼續處理子串。

*2.假如有重複值呢?

*由於全排列就是從第乙個數字起,每個數分別與它後面的數字交換,我們先嘗試加個這樣的判斷——如果乙個數與後面的數字相同那麼這兩個數就不交換了。

* 例如abb,第乙個數與後面兩個數交換得bab,bba。然後abb中第二個數和第三個數相同,就不用交換了。

* 但是對bab,第二個數和第三個數不 同,則需要交換,得到bba。

* 由於這裡的bba和開始第乙個數與第三個數交換的結果相同了,因此這個方法不行。

** 換種思維,對abb,第乙個數a與第二個數b交換得到bab,然後考慮第乙個數與第三個數交換,此時由於第三個數等於第二個數,

* 所以第乙個數就不再用與第三個數交換了。再考慮bab,它的第二個數與第三個數交換可以解決bba。此時全排列生成完畢!

最簡單的:

class

solution

permution

(str,i,result)

;sort

(result.

begin()

, result.

end())

; vector

::iterator it;

for(it = result.

begin()

;(it+1)

!= result.

end();

)else

it++;}

return result;

}void

permution

(string str,

int i, vector

& result)

for(

int j = i; j < str.

length()

;j++)}

};

改進一下:

public arraylist

permutation

(string str)

return list;

}private

void

permutationhelper

(char

chars,

int i,arraylist list)

else}}

}private

void

swap

(char

cs,

int i,

int j)

考慮字典演算法:參考

public arraylist

permutation2

(string str)

char

chars = str.

tochararray()

; arrays.

sort

(chars)

; list.

add(string.

valueof

(chars));

int len = chars.length;

while

(true)if

(lindex ==0)

break

; rindex = lindex;

while

(rindex>chars[lindex-1]

)swap

(chars,lindex-

1,rindex-1)

;reverse

(chars,lindex);

list.

add(string.

valueof

(chars));

}return list;

}private

void

reverse

(char

chars,

int k)

}}

全排列演算法 C語言

includevoid swap int a,int x,int y void perm int a,int m,int n 全排列函式 if m n for int i 0 i思路,比如要求12345的全排列,那可以先求出以1開頭,2345剩下四個數的全排列,以此類推,求出2開頭,3開頭的,最後求...

演算法 全排列

從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。用演算法分別實現全排列,其中n個元素儲存在乙個長度為n的陣列中。實現全排列之前,先看一下對進行全排列的一種方法 從圖中可以看出,我們首先從n個元素中取出乙個元...

全排列演算法

1.遞迴全排列 分別將每個位置交換到最前面位,之後全排列剩下的位。遞迴全排列 1 2 3 4 5 1,for迴圈將每個位置的資料交換到第一位 swap 1,1 5 2,按相同的方式全排列剩餘的位 2.字典序全排列演算法 對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到...