题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路 :
字符的全排列过程可以这样描述:
- 挑选出所有可以放在第一位的字符,也就是把第一个字符与剩余部分每个字符交换一次。
- 求 除第一个字符外的所有字符的全排列。
以“123”为例,红色序号表示生成顺序
描述思想很显然可以用递归来实现。对于本题有两点需要额外注意,一是输入可能有重复字符,因此需要在交换的时候判断当前字符是否与待交换字符相等;二是需要按照字典顺序输出,所以需要对最终排列结果进行排序。
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
# write code here
out = []
if len(ss) == 0:
return out
charlist = list(ss)
self.permutation(charlist, 0, out)
out = [''.join(out[i]) for i in range(len(out))]
out.sort()
return out
def permutation(self, ss, begin, out):
if begin == len(ss)-1:
out.append(ss[:])
else:
for i in range(begin, len(ss)):
# 如果是重复字符,跳过
if ss[begin] == ss[i] and begin != i:
continue
else:
# 依次与后面每个字符交换
ss[begin], ss[i] = ss[i], ss[begin]
self.permutation(ss, begin + 1, out)
# 回到上一个状态
ss[begin], ss[i] = ss[i], ss[begin]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
本题相关的排列问题还有:
【LeetCode】【31. Next Permutation】
【LeetCode】【60. Permutation Sequence】
Ways
很多人使用python的permutation库去做,那么还有什么意义呢?
这个题类似于【LeetCode】46. Permutations 解题报告,要做字符串的全排列。做法是把对字符串中的每个元素都当做起始位置,把其他元素当做以后的位置,然后再同样的进行操作。这样就会得到全排列。
这个题不使用index的原因是,我们认为已经遍历过了的元素过滤掉了,只留下了未遍历的剩余的字符串当做ss。因此,所有的元素遍历完成了,ss也就是空了,就可以结束了。
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
if not ss:
return []
res = []
self.helper(ss, res, '')
return sorted(list(set(res)))
def helper(self, ss, res, path):
if not ss:
res.append(path)
else:
for i in range(len(ss)):
self.helper(ss[:i] + ss[i+1:], res, path + ss[i])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15