1. 题目描述
描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
2. 题目解析
2.1 考察问题
本问题考察的是全排列问题。
- 全排列问题最经典的解法就是递归实现。
- 注意到题目中说有重复字符,那么就需要对全排列字符串进行过滤。
- 输出按照字典序,需要进行一次排
2.2 解决方法
-
递归穷举,map过滤
用递归的方式将所有的可能排列找出来,同时放入一个hashmap中,过滤重复的字符串。
时间复杂度 O ( n ! ) O(n!) O(n!),空间复杂度 O ( n ) O(n) O(n) -
字典排序算法
这个方法需要深入思考一下,目前没有理解。
2.3 优化分析
递归算法通过穷举来完成,字典排序算法更加简单,但理解起来比较复杂,这个实现后边继续补充。
3. 代码实现
3.1 递归穷举,map过滤
# -*- coding:utf-8 -*-
class Solution:
list_sorted = []### 由于每一次都要重复使用
def Permutation(self, ss):
self.list_sorted = [] ### 所以首次使用的时候必须初始化为空
self.PerHelper(list(ss), 0, len(ss)-1)
self.list_sorted.sort()
return self.list_sorted
def PerHelper(self, ss, start, end):
if end < start:
return
if end == start:
if not self.list_sorted.count("".join(ss)): # 0 表示 False
self.list_sorted.append("".join(ss))
return
for i in range(start, end+1):
ss[start], ss[i] = ss[i], ss[start]
self.PerHelper(ss, start + 1, end)
ss[start], ss[i] = ss[i], ss[start]