【每日算法】剑指 Offer字符串的排列
题目描述
这是 LeetCode 上的 剑指 Offer 38. 字符串的排列,
难度为 【中】
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例 1:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
提示:
1 <= s 的长度 <= 8
字符串中有可能会有重复的元素
代码实现
class Solution(object):
def permutation(self, s):
s=list(s)
res=[]
n=len(s)
def dfs(step):
if step==n-1:
res.append(''.join(s))
return
dic=set()#记录重复的字符串
for i in range(step,n):
#比如第0位已经被字符a替换过,后面再有a的话就不再被替换了
#如果替换,则替换后的字符和之前的某个其他位置上的a替换的结果是一样的
if s[i] in dic:continue#如果某个字符串已经被访问过,则直接跳过
dic.add(s[i])
s[i],s[step]=s[step],s[i]
# print(''.join(s))
dfs(step+1)
s[step],s[i]=s[i],s[step]
dfs(0)
return res