給定乙個可包含重複數字的序列,返回所有不重複的全排列
這題與上題的全排列問題類似,問題在於如何將重複序列排除在外。
這裡就需要剪枝思想,即去掉多餘的子樹。
我們先看圖,令nums=[1,1,2] !( 圖中可以看出,[1
]節點與[1]節點一致,當[1`]節點擊擇子節點時與[1]節點擊擇時一致,故應該去除。類推。
再看如何判斷剪枝:
nums[0]=1,nums[1]=1.我們需要將nums[i-1]與nums[i]進行數值判斷。同時在nums[i]為父節點進行遍歷時,判斷nums[i-1]是否已被呼叫。同時注意邊界i>0;
**在全排列問題上新增乙個剪枝語句。
public list> permute(int nums)
private void dfs(int nums, int numslength, int depth, dequepath, boolean tof, list> res)
// for迴圈遍歷
for (int i = 0; i < numslength; i++)
// 進行剪枝判斷
if (i>0 && nums[i] == nums[i -1] && !tof[i-1])
// 若未被遍歷
path.addlast(nums[i]); // 將遍歷到的nums[i]放入path尾部
tof[i] = true; // 將對應tof置為true,表示已遍歷
dfs(nums,numslength,depth+1,path,tof,res); // 繼續向下搜尋
path.removelast(); // 假設[1][2][3]回溯,返回上一層[1][2]。但是如何繼續返回[1]節點呢
// 這時候tof[1]為true,代表nums[1]已被遍歷,繼續回撤。
tof[i] = false;
}}
重複元素的全排列問題
簡介 本文主要介紹基於分治方式 遞迴 和列舉方式 迴圈 來構建指定字串的全排列方法,兩種方法都可以解決重複元素的全排列 歡迎 如有錯誤敬請指正 1.基於分治方式 遞迴實現 1 乙個元素的全排列只有一種 2 a0,a1,a2 的全排列等於下面三個全排列的並集 a0開頭,拼接上 a1,a2 的所有全排列...
全排列 不含重複元素
總結定義 從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。示例 對陣列或者字串進行全排列時,一般要求得出所有的排列結果。排列結果中的每個元素來自於原始陣列,數量和內容與原始陣列相同,只是元素的位置發生了改變...
有重複元素的全排列
題目描述 集合s中有n個元素,其中的元素可能重複,設計乙個演算法,計算出s的不同排列字元全部由小寫字母組成,輸出按照字典序輸出 n 9輸入 第一行乙個整數n 第二行乙個字串包含n個字母輸出 所有的全排列 最後一行輸出個數 樣例輸入 4 aacc 樣例輸出 aacc acac acca caac ca...