生成重複元素的全排列

2021-09-13 08:31:27 字數 1182 閱讀 6321

1. 具體分析

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

2. 思路如下:

① 將所有的元素放到乙個陣列之中,使用乙個相同長度的整型陣列用來判斷之前是否使用過數字,例如一開始陣列是這樣的:arr = ;(只有相等的元素時相鄰的那麼才可以通過判斷相鄰元素是否存在重複來決定是否可以遞迴下去),有五個1七個0,然後再宣告乙個陣列用來裝中間遞迴過程中的結果,生成的方法叫做抓取法,我們嘗試著往當前裝結果的陣列中裝入arr陣列裡面的當前元素,判斷往下遞迴生成的全排列是否是重複的關鍵就在這裡,我們需要在嘗試裝當前元素之前進行判斷,看一下當前抓取的元素與上乙個元素是否是相同的,假如是相同的,而且之前的那乙個元素還沒有被訪問過那麼這種情況往下遞迴生成的排列是具有重複的,我們不允許這樣的情況發生,直接continue掉,這樣判斷之後就不會先抓取後面的元素並且前面的相同的元素在沒有抓取的情況下

② 所以抓取的時候需要判斷當前嘗試抓取的元素是否之前被抓取過,所以需要乙個visit陣列來進行標記

③ 在嘗試抓取完當前這個元素之後,即呼叫完當前這一層的時候我們需要進行回溯,因為我需要嘗試所有的可能性,嘗試抓取陣列中的其他元素這個時候就需要將之前抓取過的元素恢復到之前沒有被抓取過的狀態,同時清除當前結果陣列中這一次遞迴放入到結果陣列中的元素

④ 經過上面的提前判斷去重之後我們生成的全排列就是沒有重複元素的,並且最重要的一點是時間複雜度比較低,在遞迴下去的之前提前進行去除掉很多重複性的排列

⑤ 對於上面生成的全排列我們是可以將其應用到剪郵票那道題去的,先生成12選5的全排列,然後再通過dfs判斷二維陣列的連通性問題即可解決,所以生成上面的排列對於某些問題的求解是很有幫助的

3. **如下:

public class main ; 

public static void main(string args)

private static void f(int k)

system.out.print("\n");

return;

} for(int i = 0; i < 12; i++)

} }}

全排列 不含重複元素

總結定義 從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...