题目链接
- 输入一个字符串,打印出该字符串中字符的所有排列。
- 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
思路
- 本题是
全排列问题,使用回溯+深度优先的思想
- 当元素遍历完,则添加进
res列表
- 若
s中有重复字符,要考虑去重问题 - 剪枝
代码实现
不考虑重复字符
class Solution:
def permutation(self, s: str) -> List[str]:
res = []
s = list(s)
def dfs(s, tmp):
if not s:
res.append(''.join(tmp))
return
for i, letter in enumerate(s):
dfs(s[:i] + s[i+1:], tmp + [letter])
dfs(s, [])
return res
考虑重复字符
- 对
s先排序,当发现相邻字符重复,则跳过当前处理的字符
class Solution:
def permutation(self, s: str) -> List[str]:
res = []
s = list(sorted(s))
def dfs(s, tmp):
if not s:
res.append(''.join(tmp))
return
for i, letter in enumerate(s):
if i > 0 and s[i] == s[i-1]: continue
dfs(s[:i] + s[i+1:], tmp + [letter])
dfs(s, [])
return res
详解
class Solution:
def permutation(self, s: str) -> List[str]:
c, res = list(s), []
def dfs(x):
if x == len(c) - 1:
res.append(''.join(c))
return
dic = set()
for i in range(x, len(c)):
if c[i] in dic: continue
dic.add(c[i])
c[i], c[x] = c[x], c[i]
dfs(x + 1)
c[i], c[x] = c[x], c[i]
dfs(0)
return res
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res=[]
nums.sort()
def helper(nums,temp):
if not nums:
res.append(temp)
for i in range(len(nums)):
if i>0 and nums[i]==nums[i-1]:
continue
helper(nums[:i]+nums[i+1:],temp+[nums[i]])
helper(nums,[])
return res