分析:采用递归,问题转化为先固定第一个字符,求剩余字符的所有排列;求剩余字符排列跟原问题一样。
1.遍历所有字符,放在第一个位置;
2.固定第一个字符,求后面字符的排列(即在第一步遍历过程中插入递归实现)。
#coding=utf-8
class Solution:
def Permutation(self,ss):
if len(ss)==0:
return [] #输入字符串为空字符串时,即长度为0,则返回空列表,注意,列表插入空字
#符''和空列表不一样,即['']和[]不相等
l=list()
self.perm(ss,l,'') #调用递归函数,递归结束后列表即包含所有的排列(因存在相同字符,故包
#含重复排列)
res=list(set(l)) #集合去除重复元素
return sorted(res) #按首字母排序,排序按ASII码表进行
def perm(self,ss,l,s):
if ss=='':
l.append(s) #s初始为空字符,当ss为空时,即已实现一个排列,并存到s中,将s加到列表中
else:
for i in range(len(ss)):
self.perm(ss[:i]+ss[i+1:],l,s+ss[i]) #第一层递归,s为前一个字符,共有
#len(ss)种,
#第二层递归,s为前两个字符的排列,共有
#len(ss)*(len(ss)-1)种
#以此类推,最后一层递归时,s共有
#len(ss)*(len(ss)-1)*...*2*1种排列