【力扣】08.08:有重複字符串的排列組合 |回溯算法

題目描述

有重複字符串的排列組合。編寫一種方法,計算某字符串的所有排列組合。

算法思路

標準回溯算法。集合去重。

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%的用戶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章