题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路
解题分为两步:
求后面所有字符的排列可以使用递归。把后面所有字符分为两部分:后面字符的第一个字符,以及这个字符之后的所有字符,然后递归使用前面的两步法即可。
以abc为例:
固定a,剩下bc;
bc中固定b,剩下c;固定c,剩下b;所以bc的排列有bc,cb两种。
所以a为第一位时,有abc,acb两种。
同理b为第一位时,有bac,bca两种。
c为第一位时,有cba,cab两种。
实战
def Permutation(ss):
# write code here
if not ss:
return []
def recc(beg, string):
if beg == len(string) - 1:
res.add(''.join(string))
for i in range(beg, len(string)):
string[i], string[beg] = string[beg], string[i]
recc(beg + 1, string)
string[i], string[beg] = string[beg], string[i]
res = set()
recc(0, list(ss))
return sorted(list(res))
第二种写法:
class Solution:
def Permutation(self, ss):
# write code here
if not ss:
return []
def recc(string, s):
if not string:
res.add(s)
for i in range(len(string)):
recc(string[:i]+string[i+1:], s+string[i])
res = set()
recc(ss, '')
return sorted(list(res))
拓展:
字符串的组合。
abc的组合有a,b,c,ab,ac,abc。ab和ba是同一种组合,不同种排列。
实战
def Permutation(ss):
# write code here
if not ss:
return []
def recc(string, s):
if s:
res.add(s)
for i in range(len(string)):
recc(string[i+1:], s + string[i])
res = set()
recc(ss, '')
return sorted(list(res))