昨天我们学习了递归思想和动态规划思想,今天我们做两道实战题
LeetCode:
17. Letter Combinations of a Phone Number
https://leetcode.com/problems/letter-combinations-of-a-phone-number/
电话号码的字母组合
例子为求2,3对应字母的所有组合:
Input: “23” #输入的变量为str
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. #输出为List[str]
一看例子,组合,两个循环还不就出结果了啊,有一种昨天动态规划的感觉,如果存在第三个数,直接拿前两次的结果结合就行
迭代走一下:
class Solution:
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
dict = {2:"abc",3:"def",4:"ghi",5:"jkl",6:"mno",7:"pqrs",8:"tuv",9:"wxyz"}
list = []
if not digits:
return []
if len(digits) ==1:
for i in dict[int(digits)]:
list.append(i)
return list
a = dict[int(digits[0])]
for i in range(len(digits)-1):
b = dict[int(digits[i+1])]
list = []
for j in a:
for k in b:
list.append(j+k)
a = list
return list
既然是递归实战,怎么能少得了递归的解法呢
经过迭代的思考,这道题递归的递归解法就很好理解了,就是复合函数的感觉
以2345为例,刚开始,2是头345是尾。再进函数3是头,45是尾。然后4是头5是尾
把头尾加在一起,返回时,4+5,3+45,2+345,得到结果
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
dict = {"2":"abc", "3":"def", "4":"ghi", "5":"jkl", "6":"mno", "7":"pqrs", "8":"tuv", "9":"wxyz"}
if len(digits) == 0:
return []
elif len(digits) == 1:
return list(dict[digits])
head = digits[0]
rest = digits[1:] #做个切片
rest_combo = self.letterCombinations(rest)
head_combo = dict[head]
return [h + s for s in rest_combo for h in head_combo]
46. Permutations
给定一组两两不等的整数,返回所有可能的排列。
想出一种插空方法。刚开始只有1自己。2来了插一下,插左为21,插右为12。3也想插,那就先插21,得到321,231,213,再插12,得到312,132,123。以此类推
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if not nums:
return [[]]
res = []
for i in range(len(nums)):
cut_in = nums[i]
rest = nums[:i]+nums[i+1:]
for p in self.permute(rest):
res.append([cut_in]+p)
return res
在讨论区看到一个内置函数偷懒大法:
def permute(self, nums):
return list(itertools.permutations(nums)) #函数返回的结果是元祖,转换成列表
***或者***
def permute(self, nums):
return map(list, itertools.permutations(nums))
下次见