一.电话号码的字母组合
题目大意:将给定的一个仅包含数字2~9的字符串 按照电话九宫格上数字与字母的对应关系 输出所有可能的字母组合
题目分析:本题的难点在于数字字符串的长度是个变量,若是一个固定的几位数,那么就可以写几重循环,依次输出即可。
我的解题思路是:首先将字符串中的每个数字对应成一个字母列表,按顺序将各个字母列表放在一个列表中,比如“23”,就可以转换为[[“a”,“b”,“c”],[“d”,“e”,“f”]],因为这里数字字符串的长度不唯一,也就是大列表中的小列表个数不是一个常数,所以要换一个思路。首先固定第一个小列表,对于后面的每一个小列表,依次将它们的每一个元素与第一个列表中的元素组合,作为第一个列表中的新的元素,同时删去旧的元素。
例如:数字字符串“234”,第一个小列表[“a”,“b”,“c”],将第二个小列表[“d”,“e”,“f”]与其组合,同时删去旧的元素,即得到[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”],然后再将这个列表和第三个“4”对应的[“j”,“h”,“i”]组合即可。
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if digits == "":
return []
nums_to_letters = {
2: "abc",
3: "def",
4: "ghi",
5: "jkl",
6: "mno",
7: "pqrs",
8: "tuv",
9: "wxyz"
}
combs = [""]
for digit in digits:
new_combs = []
for comb in combs:
for letter in nums_to_letters[int(digit)]:
new_combs.append(comb + letter)
combs = new_combs
return combs
二.全排列
要求:给定一个没有重复数字的序列,返回其所有可能的全排列。
思路:[1,2,3,4]=([1,2,3]+4) = [4,1,2,3]+[1,4,2,3]+[1,2,4,3]+[1,2,3,4]
[1,2,3] =([1,2]+3) = [3,1,2]+[1,3,2]+[1,2,3]
由此可知采用递归求解
def copy_remove(l,x):
a=[]
for i in l:
a.append(i)
a.remove(x)
return a
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums)==1:
return [[nums[0]]]
perms=[]
for i in nums:
a=copy_remove(nums,i)
ways=self.permute(a)
for a in ways:
perms.append([i]+a)
return perms