剑指 Offer 38. 字符串的排列
每日几道leetcode刷刷题!
JZ-Offer38
题目描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例 1:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
代码
class Solution:
def permutation(self, nums: List[int]) -> List[List[int]]:
# res用来存放结果
if not nums: return []
res = []
used = [0] * len(nums)
def backtracking(nums, used, path):
# dfs终止条件
if len(path) == len(nums):
res.append(''.join(path))
return
for i in range(len(nums)):
if not used[i]: #如果还未被遍历
if i>0 and nums[i] == nums[i-1] and not used[i-1]: #避免重复元素
continue
used[i] = 1
path.append(nums[i])
backtracking(nums, used, path)
path.pop()
used[i] = 0
# 给nums排序
backtracking(sorted(nums),used,[])
return res
总结
回溯+DFS,难点在于任意顺序返回这个字符串数组,但里面不能有重复元素。