重複元素的全排列問題

2021-08-15 13:47:42 字數 819 閱讀 9275

簡介:本文主要介紹基於分治方式(遞迴)和列舉方式(迴圈)來構建指定字串的全排列方法,兩種方法都可以解決重複元素的全排列

歡迎**,如有錯誤敬請指正

1. 基於分治方式(遞迴實現)

1)乙個元素的全排列只有一種

2)[a0, a1, a2]的全排列等於下面三個全排列的並集

a0開頭,拼接上[a1,a2]的所有全排列

a1開頭,拼接上[a0,a2]的所有全排列

a2開頭,拼接上[a0,a1]的所有全排列

所以,對於[a0, a1, ……,an]的全排列,我們可以將問題轉換成n個子問題:

a0開頭,拼接上[a1,a2 ……,an]的所有全排列

a1開頭,拼接上[a0,a2 ……,an]的所有全排列

……an開頭,拼接上[a0,a2 ……,a(n-1)]的所有全排列

而每個子問題又可以繼續向下轉化成n-1個子問題,最終可以轉化到只有乙個元素的全排列問題。

對於陣列中有重複元素的情況,我們只要保證,重複元素只能有一次作為子問題的開頭元素,這樣我們就可以避免重複計算。

2. 基於列舉方式(迴圈實現)

如果我們將全排列按照大小順序進行排序,假設我們知道了第i個排列是[a0, a1, a2, a3, ……],那麼第i+1個排列就是比[a0, a1, a2, a3, ……]大,且最小的那個。找到i+1個排列的步驟如下

1)從後往前兩兩比較,找到第乙個滿足a[i]

2)從a[i+1]開始往後找,找到乙個大於a[i]中最小的乙個元素,這個元素的下標記為j,交換a[i]和a[j]

3)將[i+1, a.length-1]的元素全部逆序

筆者只理解了第一種方法

全排列 不含重複元素

總結定義 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。示例 對陣列或者字串進行全排列時,一般要求得出所有的排列結果。排列結果中的每個元素來自於原始陣列,數量和內容與原始陣列相同,只是元素的位置發生了改變...

有重複元素的全排列

題目描述 集合s中有n個元素,其中的元素可能重複,設計乙個演算法,計算出s的不同排列字元全部由小寫字母組成,輸出按照字典序輸出 n 9輸入 第一行乙個整數n 第二行乙個字串包含n個字母輸出 所有的全排列 最後一行輸出個數 樣例輸入 4 aacc 樣例輸出 aacc acac acca caac ca...

生成重複元素的全排列

1.具體分析 我們在很多時候都需要使用到全排列,但是有的時候由於元素是重複的,所以先生成全排列然後再進行判斷的話那麼消耗的時間比較多,有可能在資料規模比較大的時候就計算不出來,這個時候我們可以採用另外一種的方法來提前判斷遞迴下去的全排列是否是重複的 2.思路如下 將所有的元素放到乙個陣列之中,使用乙...