一、题目描述
二、思路以及代码
递归思路:
分解字符串,将其视为第一个字符和其余字符的组合,利用这个函数反复得到
首字母+其余字符串的全排列,直到其余字符串长度为1返回。
最终利用list(set(lst))对lst去重。
理解简单,书写便捷,缺点是耗时较久。
class Solution:
#递归
def permutation(self, s: str):
if len(s)==1:
return [s]
lst=[]
for index in range(len(s)):
rets=self.permutation(s[:index]+s[index+1:])
for ret in rets:
lst.append(s[index]+ret)
return list(set(lst))
循环思路
参考了“he___jia”的题解,笔者手写代码。
主要思路是:
从一个字符开始,每轮循环增加一个字符,
在之前字符全排列的基础上逐空插入下一个字符,最终得到多一个字符的全排列,循环下去,得到所有字符的全排列。
class Solution:
#循环
def permutation(self, s: str):
rets=set(s[0])
index,l=1,len(s)
#循环开始
while(index<len(s)):
temp=set()
for ret in rets:
for j in range(len(ret)+1):
string=ret[:j]+s[index]+ret[j:]
temp.add(string)
index+=1
rets=temp
return list(rets)
三、执行用时比较
笔者手写的递归740ms,循环76ms(原循环题解作者为40ms,膜拜)。