面试题08.08.有重复字符串的排列组合
输入:abcc
输出:[“abcc”,“acbc”,“accb”,“bacc”,“bcac”,“bcca”,“cabc”,“cacb”,“cbac”,“cbca”,“ccab”,“ccba”]
- 第一种方法:暴力,使用set
class Solution:
def permutation(self, S: str) -> List[str]:
if len(S) <= 1:
return [S]
def rec(s):
if len(s) == 2:
return [s[0]+s[1],s[1]+s[0]]
res = []
for i,ch in enumerate(s):
res_list = rec(s[0:i]+s[i+1:])
for r in res_list:
res.append(ch+r)
res = list(set(res))
return res
return rec(S)
- 第二种方法:使用剪枝
剪枝:循环遍历,每一字符都将作为排列组合的起始字符,以某一字符开始的排列组合,后面将不能有与其相同的开始,将相同的字符开始的情况过滤掉,也就是剪枝
class Solution:
def permutation(self, S: str) -> List[str]:
def rec(s):
if len(s) == 1:
return list(s)
set_s = set()
res_list = []
for i, ch in enumerate(s):
if ch in set_s:
continue
set_s.add(ch)
res = rec(s[0:i] + s[i+1:])
l1 = list(map(lambda x: ch + x, res))
res_list.extend(l1)
return res_list
if len(S) <= 1:
return [S]
return rec(''.join(list(sorted(S))))
- 第三种方法:使用python包itertools
import itertools
class Solution:
def permutation(self, S: str) -> List[str]:
return [''.join(i) for i in set(itertools.permutations(S))]