對於n個不同元素集合r的全排列問題,可以用乙個簡單遞迴的公式表達:
當n = 1
時, p(r) = r, 否則
p(r) = ri + p(r - ) (i = 1, 2, ..., n)
p(r) : 不含重複元素的
r集合的全排列
+: 表示連線
根據上面的公式寫出遞迴計算出無重複元素序列的全排列:
perm(type list, int k, int m)
if k=m
then print( list )
else
for i=k to m do
swap( list[k],list[i] );
perm(list,k+1,m);
swap(list[k],list[i]);
1. 對於含有重複元素的序列,我們不能再像上面那樣簡單的交換與來求解。因為,當ri 到rk 的序列中,如果存在元素 rj = rk 且 j != k 。這時,rj 必然是已經和 ri 交換過位置,並且計算了 rj + p(r - ) 。如果再將 rk 與 ri 與交換,則會得到 rk + p(r - ) 這個全排列,而rj = rk,所以,我們第二次計算多餘了。
2. 再考慮當從ri 到rk 的序列中,如果不存在有元素 rj = rk , 那麼,這時的情況是和普通計算時過程一樣,交換ri 與rk 然後求解 就可以了,因為即使在後面存在與其他重複元素,我們也會在計算中按第1
步剪掉重複計算。
所以,在求解時我們只要保證交換某一元素時,其未有在i...j
之間出現過。否則交換後必會重複求解。
int ok(char *origin, int x, int y)
void permutation(char *origin, int curlen, int maxlen)
else }
}
全排列 不含重複元素
總結定義 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。示例 對陣列或者字串進行全排列時,一般要求得出所有的排列結果。排列結果中的每個元素來自於原始陣列,數量和內容與原始陣列相同,只是元素的位置發生了改變...
重複元素的全排列問題
簡介 本文主要介紹基於分治方式 遞迴 和列舉方式 迴圈 來構建指定字串的全排列方法,兩種方法都可以解決重複元素的全排列 歡迎 如有錯誤敬請指正 1.基於分治方式 遞迴實現 1 乙個元素的全排列只有一種 2 a0,a1,a2 的全排列等於下面三個全排列的並集 a0開頭,拼接上 a1,a2 的所有全排列...
有重複元素的全排列
題目描述 集合s中有n個元素,其中的元素可能重複,設計乙個演算法,計算出s的不同排列字元全部由小寫字母組成,輸出按照字典序輸出 n 9輸入 第一行乙個整數n 第二行乙個字串包含n個字母輸出 所有的全排列 最後一行輸出個數 樣例輸入 4 aacc 樣例輸出 aacc acac acca caac ca...