目录
LeetCode 46.全排列
LeetCode 47.全排列II
剑指Offer 38.字符串的全排列
LeetCode 46.全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路
求全排列,可以看成两步:
- 第一步求可能出现在第一个位置的字符;
- 第二步对剩下的序列进行全排列。
结合例子进行说明:
输入: [1,2,3]
先选1作为首位:
第二轮在剩下的[2,3]里选2作为首位,第三轮只剩下[3],故得到排列[1,2,3];
第二轮在剩下的[2,3]里选3作为首位,第三轮只剩下[2],故得到排列[1,3,2]。
若以2作为首位:
第二轮在剩下的[1,3]里选1作为首位,第三轮只剩下[3],故得到排列[2,1,3];
第二轮在剩下的[1,3]里选3作为首位,第三轮只剩下[1],故得到排列[2,3,1]。
若以3作为首位:
第二轮在剩下的[1,2]里选1作为首位,第三轮只剩下[2],故得到排列[3,1,2];
第二轮在剩下的[1,2]里选2作为首位,第三轮只剩下[1],故得到排列[3,2,1]。
得到输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
itertools.permutations
看看就好,真敢这么写就走远了。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(itertools.permutations(nums))
递归
class Solution:
def __init__(self):
self.res = []
def permute(self, nums: List[int]) -> List[List[int]]:
self.permutation(nums,[])
return self.res
def permutation(self,nums, sub):
if not nums:
self.res.append(sub)
for i in range(len(nums)):
self.permutation(nums[:i] + nums[i+1:], sub+[nums[i]])
LeetCode 47.全排列II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
递归
在上题基础上多了一个不含重复的要求。
因为list不能作为set的元素,因此不能用list(set())的方式进行去重。
class Solution:
def __init__(self):
self.res = []
def permute(self, nums: List[int]) -> List[List[int]]:
self.permutation(nums,[])
return self.res
def permutation(self,nums, sub):
if not nums and sub not in self.res:
self.res.append(sub)
for i in range(len(nums)):
self.permutation(nums[:i] + nums[i+1:], sub+[nums[i]])
剑指Offer 38.字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
解题思路
这题与上题思路类似,输入从数组换成了字符串。
递归
class Solution:
def __init__(self):
self.res = []
def Permutation(self, ss):
# write code here
if not ss: return ''
self.permute(ss,'')
#去重并按字典序排序
return sorted(list(set(self.res)))
def permute(self, ss, sub):
if not ss:
self.res.append(sub)
for i in range(len(ss)):
self.permute(ss[:i] + ss[i+1:], sub+ss[i])
LeetCode 567.字符串的排列
待补充
2019.8.12 补充LeetCode47