#这题可以通过递归完成,但要注意去重的问题
class Solution:
def Permutation(self , str: str) :
# write code here
def back(path,used): #path用来记录当前的字符串
if len(path)==k :
#记住这里不要加入上面if path not in res来去重,对于多次递归来说,实在太慢了,尤其是res设置成列表的时候,每做依次判断,都要在列表里面遍历一遍,时间复杂度最多能能达到:(列表长度)*n!
res.add(path)
return
for i in range(len(str)):
if i>0 and str[i]==str[i-1] and used[i-1]==0:continue #这一句避免重复字符串(例如aab会输出两个aab),虽然做了结果做了去重,但直接从循环下手,也很省时间
if used[i]:continue
used[i]=1
#这两句话主要为了判断元素是否被使用(例如:aab,第一个a被用了,used会变成[1,0,0]),将它带入下个递归时,循环语句就会自己跳过它,只遍历ab,最后输出aab,aba
back(path+str[i],used)
#开始递归
used[i]=0 #这个循环用完了,记得把它改回来,不然在循环第二个used就会是【1,1,0】,那么最终只会输出了ab了
res=set() #为了省去去重的麻烦,直接把res设置成集合,让它自己去去重,输出结果的时候再转回来就行了,反正结果不在乎顺序
path=""
k=len(str)
back("",[0]*k)
return list(res)