剑指Offer38-字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
来源:力扣(LeetCode)
链接:力扣
一解
使用回溯法,以 s="abc"
为例:
先随机固定(通过交换实现:c[i], c[x] = c[x], c[i]
)第一个字母: a 或 b 或 c:
然后固定第二个字母:
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)):
# 如果出现重复,进行剪枝
# 比如 aaaab
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