题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路:这道题想的时候思路来的还挺快的,但是真的写了很久,有一些用法还不太熟悉,得一点一点地查找.
如,输入abc,则思路如下:即将元素左右空都设置成#,则新来一个字符只要插空就行了.如果
#a#
#b#a# #a#b#
#c#b#a# #b#c#a# #b#a#c# #c#a#b# #a#c#b# #a#b#c#
代码:
class Solution:
def AppendSym(self,c):
return '#'+c+'#'
def Iter(self,ss,stack1,stack2):
#本来想只用一个stack,但是后来发现越想越乱,控制不好循环的结束条件,所以用了两个栈
if ss:
#提取待插入的字符串'#a#'
str_ss = ss.pop(0)
#现存的要插入的字符串
str_list = list(stack1.pop(0))
#将字符串里的#分别换成str_ss
for i in index:
str_list[i] = str_ss
stack2.append(''.join(str_list)) #将生成的list连接成string
str_list[i] = '#' #还原原来的list,要不然stack1中的下一个 要插入的字符串就不对应了,因为list已经变了
#新生成的要插入的字符串
self.Iter(ss,stack2,stack1) #递归方法if stack1:
return stack1
else:
return stack2
def Permutation(self, ss):
stack1 = []
stack2 = []
if ss:
#这几步的想法是把字符串中的每一个字符都变成'#a#'的形式
ss = list(ss) #没找到在字符串中一次性插值的函数,所以就把它变成listss = map(self.AppendSym,ss)
stack1.append(ss.pop(0))
res_list = self.Iter(ss,stack1,stack2) #进入子函数递归
if res_list:
res_list = [i.replace('#','') for i in res_list]
res_list = list(set(res_list))
res_list.sort() #因为要按字典顺序输出,所以要sort一下
else:
res_list = [i.replace('#', '') for i in stack1]
res_list = list(set(res_list))
return res_list
else:
return []
看到牛友上有人给出了这样的答案,感慨python内嵌函数的伟大:
import itertools class Solution: def Permutation(self, ss): res = [] if not ss: return res s = sorted(ss) num = len(s) for i in itertools.permutations(s,num): res.append(''.join(i)) return sorted(list(set(res))) #去掉重复元素并排序 a = 1