含重複元素序列的全排列

2021-06-19 14:14:12 字數 964 閱讀 5080

對於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...