输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
字符的全排列过程可以这样描述:
1.挑选出所有可以放在第一位的字符,也就是把第一个字符与剩余部分每个字符交换一次。
2.求 除第一个字符外的所有字符的全排列。
其实就是说就是把每一次的字符串的第一位的情况都考虑到。
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.result = []
def Permutation(self, ss):
# write code here
if len(ss) == 0:
return []
self.PermutationCore(ss, 0)
sorted(self.result)
return self.result
def PermutationCore(self, str_, begin):
if begin == len(str_):
self.result.append(str_)
return
for i in range(begin, len(str_)):
# 头字符和后面字符串里有相同的,就跳过去
if i != begin and str_[i] == str_[begin]:
continue
str_list = list(str_)
# 交换位置
str_list[i], str_list[begin] = str_list[begin], str_list[i]
str_ = ''.join(str_list)
# 迭代找剩下的字符串
self.PermutationCore(str_, begin+1)
简洁版代码:
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
if len(ss) <=0:
return []
res = list()
self.perm(ss,res,'')
uniq = list(set(res))
return sorted(uniq)
def perm(self,ss,res,path):
if ss=='':
res.append(path)
else:
# 就是依次从ss拿出来当第一位存在path里
for i in range(len(ss)):
self.perm(ss[:i]+ss[i+1:],res,path+ss[i])