题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题方案:
这里直接用python的itertools模块中的生成器函数permutations,将迭代对象中的元素排列在一起,每组排列是有顺序的。
其他函数:combinations也将元素进行组合,只是不在意元素之间的顺序;product是笛卡尔积操作。
其次,采用python内置函数进行处理:set()函数去重,sorted()函数进行排列。
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
# write code here
if len(ss) <= 1:
return list(ss)
#l = list(ss)
res = []
from itertools import permutations
for item in permutations(ss, len(ss)):
tmp = ''
for i in item:
tmp+= i
res.append(tmp)
return list(sorted(set(res)))
# -*- coding:utf-8 -*-
import itertools
class Solution:
def Permutation(self, ss):
# write code here
if not ss:
return []
return sorted(list(set(map(''.join, itertools.permutations(ss)))))
以上方法更加简单,采用高阶函数map,以及str.join方法。
正常的思路是采用动态规划,注意深度优先遍历函数DFS的写法:
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
# write code here
if len(ss) <= 1:
return list(ss)
self.visited = [0 for i in range(len(ss))]
self.res = []
tmp = ''
self.DFS(ss, tmp)
return list(sorted(set(self.res)))
def DFS(self, ss, tmp):
if len(tmp) == len(ss):
self.res.append(tmp)
return
for idx in range(len(ss)):
if self.visited[idx] == 0:
self.visited[idx] = 1
tmp += ss[idx]
self.DFS(ss, tmp)
tmp = tmp[:-1]
self.visited[idx] = 0