题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
用例
输入 | 输出 |
---|---|
abc不加sort | [‘abc’, ‘acb’, ‘bac’, ‘bca’, ‘cba’, ‘cab’] |
abc加sort | [‘abc’, ‘acb’, ‘bac’, ‘bca’, ‘cab’, ‘cba’] |
abcd不加sort | [‘abcd’, ‘abdc’, ‘acbd’, ‘acdb’, ‘adcb’, ‘adbc’, ‘bacd’, ‘badc’, ‘bcad’, ‘bcda’, ‘bdca’, ‘bdac’, ‘cbad’, ‘cbda’, ‘cabd’, ‘cadb’, ‘cdab’, ‘cdba’, ‘dbca’, ‘dbac’, ‘dcba’, ‘dcab’, ‘dacb’, ‘dabc’] |
abcd加sort | [‘abcd’, ‘abdc’, ‘acbd’, ‘acdb’, ‘adbc’, ‘adcb’, ‘bacd’, ‘badc’, ‘bcad’, ‘bcda’, ‘bdac’, ‘bdca’, ‘cabd’, ‘cadb’,== ‘cbad’==, ‘cbda’, ‘cdab’, ‘cdba’, ‘dabc’, ‘dacb’, ‘dbac’, ‘dbca’, ‘dcab’, ‘dcba’] |
解题思路
思路:回溯法,也可以直接使用库函数
这道题要注意两个问题:
第一个是重复字母,第二个是按字典顺序。
python 两种解法
回溯法
# -*- coding:utf-8 -*-
class Solution:
def Permutation(self, ss):
resultList = []
if len(ss) == 0:
return resultList
track = []
visit = [0]*len(ss)
self.backtrack(list(ss),track,resultList,visit)
resultList.sort()
return resultList
# 回溯算法
def backtrack(self, nums, track, resultList,visit):
# 触发结束条件
if len(track) == len(nums):
# 例如:"aa"对应输出应该为["aa"]
if "".join(track) not in resultList:
resultList.append("".join(track))
return
for i in range(len(nums)):
if visit[i] == 1:
continue
visit[i] = 1
# 做选择
track.append(nums[i])
# 进入下一层决策树
self.backtrack(nums, track, resultList,visit)
# 取消选择,返回上一层决策树
track.pop()
#
visit[i] = 0
s = Solution()
result = s.Permutation("abc")
print(result)
使用库函数
# -*- coding:utf-8 -*-
import itertools
class Solution:
def Permutation(self, ss):
# write code here
result=[]
if not ss:
return []
else:
res=itertools.permutations(ss)
for i in res:
if "".join(i) not in result:
result.append("".join(i))
return result