数据结构与算法(六)递归实战

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_39538889/article/details/86100758


昨天我们学习了递归思想和动态规划思想,今天我们做两道实战题

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

https://leetcode.com/problems/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))

下次见

猜你喜欢

转载自blog.csdn.net/weixin_39538889/article/details/86100758