題目描述
有重複字符串的排列組合。編寫一種方法,計算某字符串的所有排列組合。
算法思路
標準回溯算法。集合去重。
class Solution:
def permutation(self, S: str) -> List[str]:
ds=set()
n=len(S)
def helper(S,n,t):
if len(t)==n and t not in ds:
ds.add(t)
for i in range(len(S)):
helper(S[:i]+S[i+1:],n,t+S[i])
helper(S,n,'')
return list(ds)
608 ms 14.2 MB Python3
剪枝
class Solution:
def permutation(self, S: str) -> List[str]:
res = []
S = sorted(list(S))
n=len(S)
def backward(S,n,t=[]):
if len(t)==n:
res.append(''.join(t))
return
for i in range(len(S)):
if i>0 and S[i]==S[i-1]:continue
backward(S[:i]+S[i+1:],n,t+[S[i]])
backward(S,n)
return res
執行用時 :40 ms, 在所有 Python3 提交中擊敗了94.76%的用戶
內存消耗 :13.9 MB, 在所有 Python3 提交中擊敗了100.00%的用戶
優化
class Solution:
def permutation(self, S: str) -> List[str]:
res = set()
S = list(S)
def backward(first):
if first == len(S)-1 and ''.join(S) not in res:
res.add(''.join(S))
return
for i in range(first, len(S)):
S[i], S[first] = S[first], S[i]
if ''.join(S) not in res:
backward(first+1)
S[i], S[first] = S[first], S[i]
backward(0)
return list(res)
執行用時 :40 ms, 在所有 Python3 提交中擊敗了94.76%的用戶
內存消耗 :14 MB, 在所有 Python3 提交中擊敗了100.00%的用戶