問題描述:
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
如下圖所示,忽略紫色字型關於swap部分,因為這張中涉及的swap是另外一種思想的方法,而我這裡是利用的不涉及swap的方法,只是借用這張進行描述。如果乙個元素被訪問過,則標記為紅色。字串包含幾個元素那麼數的高度就是幾,這裡包含a,b,c 3個元素,所以樹的高度就是3。
結合abc這個例子具體描述一下演算法流程:
1) 在第一層,a是第乙個未訪問的元素,將a新增到輸出佇列,同時將a標記為紅色(已訪問);當前層level=1,不是最後一層,遞迴到第二層;
2) 在第二層,因為a已經訪問過,所以b是第乙個未訪問過的元素,將b新增到輸出佇列,同時將b標記為紅色(已訪問),當前層level=2,不是最後一層,遞迴到第三層
3)在第三層,因為a,b都已經訪問過,所以c是第乙個未訪問過的元素,將c新增到輸出佇列,同時將c標記為紅色(已訪問),當前層level=3,是最後一層;到達最後一層之後說明找到了乙個排列abc,將該排列輸出;到達最後一層之後需要向前一層(第二層)回溯,在回溯之前需要將c標記為未訪問,因為c是在當前層(第三層)訪問的,而上一層(第二層)並沒有訪問,因此在回溯到第二層之前各元素的訪問狀態應該恢復到第二層的初始狀態;
4)回溯到第二層之後,尋找第二個未訪問過元素c,將c新增到輸出佇列,(注意:這裡的c將會覆蓋在第 2步中新增到佇列的b,因為輸出佇列中元素的下標是level),同時將c標記為紅色(已訪問),當前層level=2,不是最後一層,遞迴到第三層。
5) 此時的第三層第乙個未標記的元素是b,將b新增到輸出佇列,同時將b標記為紅色(已訪問),當前層為第三層是最後一層;到達最後一層之後說明又找到乙個排列acb,將該排列輸出;接著再回溯到第二層,回溯到第二層之前,同樣需要將c標記為未訪問。
6)此時又回溯到第二層,第二層的第二,第三個元素都已經遍歷過,即第二層此時不存在未遍歷過的元素,此時需要回溯到第一層,同理,回溯到第一層直前,需要將a標記為未訪問。
7) 此時回溯到第一層,尋找第二個未訪問過的元素b,將b新增到輸出佇列,同時標記b為紅色(已訪問),下面的步驟和第2步中的做法一致。
8)到最後輸出了每乙個可能的排列。
# -*- coding:utf-8 -*-
#思路:回溯法,全排列問題
class solution:
def __init__(self):
self.l=0
self.data=
self.used= #標誌某乙個元素是否被訪問過
self.result= #記錄乙個排列
self.re=set() #利用set記錄全部排列,可去重
def permutation(self, ss):
# write code here
self.l=len(ss)
if self.l == 0:
return
else:
self.data = ss
self.used = [false] * self.l
self.result = [0] * self.l
self.permutationhelper(1)
return sorted(self.re) # 保證輸出的是字典序
def permutationhelper(self,level):
for i in range(0,self.l): #在每一層需要遍歷全部元素
if not self.used[i]:
self.result[level-1]=self.data[i]
self.used[i]=true
if level!=self.l:
self.permutationhelper(level+1)
else:
self.re.add(''.join(self.result))
self.used[i]=false
回溯法 全排列
有重複數字的全排列 元素奇偶相間的排列 給定乙個沒有重複數字的序列,返回其所有可能的全排列。輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 利用 回溯法排列樹模板 沒有限定條件即就是沒有衝突。class solution def permute sel...
字串的排列 全排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。使用itertools中的permutations,可以實現全排列 ...
字串全排列 java實現
經常會遇到字串全排列的問題。例如 輸入為,則其全排列組合為abc,acb,bac,bca,cba,cab。對於輸入長度為n的字串陣列,全排列組合為n 種。思路 從字串陣列中每次選取乙個元素,作為結果中的第乙個元素。然後,對剩餘的元素全排列,步驟跟上面一樣。很明顯這是個遞迴處理的過程,一直到最後即可。...