本文共 4040 字,大约阅读时间需要 13 分钟。
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] # 交换,将 c[i] 固定在第 x 位 dfs(x + 1) # 开启固定第 x + 1 位字符 c[i], c[x] = c[x], c[i] # 恢复交换 dfs(0) return res'''作者:jyd链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/来源:力扣(LeetCode)'''
ss:待处理的序列
res:已存入的序列 ans:存放已排序好的字符串
class Solution(object): def permutation(self, s): s_list = list(s) ans = set() def dfs(ss, res=[]): if len(ss) == 0: ans.add("".join(res)) return for i in range(len(ss)): dfs(ss[:i]+ss[i+1:], res+[ss[i]]) dfs(s_list, []) return list(ans)'''作者:fei-ben-de-cai-zhu-UC4q0zhusJ链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/pythonhui-su-fa-setjie-ti-by-fei-ben-de-cai-zhu-uc/来源:力扣(LeetCode)'''递归的另一种写法 快一点
class Solution: def permutation(self, s: str) -> List[str]: if len(s) <=0: return [] res = list() self.perm(s,res,'') uniq = list(set(res)) return sorted(uniq) def perm(self,ss,res,path): if ss=='': res.append(path) else: for i in range(len(ss)): self.perm(ss[:i]+ss[i+1:],res,path+ss[i])
【附】打印版
–思路1–class Solution: def permutation(self, s): c, res = list(s), [] def dfs(x): # print('固定 x=',x) if x == len(c) - 1: print('最后一个字符x =',c[x]) print('排序好的c=',c) res.append(''.join(c)) # 添加排列方案 遇到终止条件时,才添加最后一个元素 print('此时res=',res) print() return dic = set() for i in range(x, len(c)): if c[i] in dic: continue # 重复,因此剪枝 dic.add(c[i]) print('当前字符c[x] =',c[x],end='\t\t') print('c[%d]=%s'%(i,c[i]),end='\t') print('i还可取:',[i for i in range(x+1,len(c))]) print('待排序的dic =',dic) c[i], c[x] = c[x], c[i] # 交换,将 c[i] 固定在第 x 位 print('# 交换后c =',c) print('开始c[x+1]=c[%d]=%s的回溯:'%((x+1),c[x+1])) dfs(x + 1) # 开启固定第 x + 1 位字符 # print('添加后 dic=',dic) c[i], c[x] = c[x], c[i] # 恢复交换 print('恢复交换c =',c) print('==='*10) dfs(0) return resif __name__ == "__main__": s = "abc" print(Solution().permutation(s))
–思路2–
class Solution2(object): def permutation(self, s): s_list = list(s) ans = set() def dfs(ss, res=[]): if len(ss) == 0: ans.add("".join(res)) print('ans=',ans) print('结束一轮') return for i in range(len(ss)): print('ss=',ss,end='\t') print('res=',res) print(ss[:i]+ss[i+1:],res+[ss[i]]) dfs(ss[:i]+ss[i+1:], res+[ss[i]]) dfs(s_list, []) print(ans) return list(ans)if __name__ == "__main__": s = "abc" print(Solution().permutation(s))
转载地址:http://bfjii.baihongyu.com/