17.电话号码的字母组合

在这里插入图片描述
问题:返回所有组合-》回溯/队列/递归

递归:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits: return [] # 输入为空的特殊情况

        digitDict = { # 电话号码的数字对应字母字典
            '2':['a','b','c'],
            '3':['d','e','f'],
            '4':['g','h','i'],
            '5':['j','k','l'],
            '6':['m','n','o'],
            '7':['p','q','r','s'],
            '8':['t','u','v'],
            '9':['w','x','y','z']
        }
        # 递归函数
        def backtrack(former, nextdigits): # former记录之前的结果-字母串,nextdigits记录剩下需要添加的数字字母
            if len(nextdigits) == 0: # 递归出口:后面没有数字了
                res.append(former) # 添加到结果中
            else:
                for letter in digitDict[nextdigits[0]]: # 只对第一个数字进行字母遍历
                    backtrack(former+letter, nextdigits[1:]) # 字母拼接,并继续递归剩下的数字

        
        res = []
        backtrack("",digits) #初始入口
        return res

队列:

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        if not digits: return []
        
        digitDict = { # 电话号码的数字对应字母字典
            '2':['a','b','c'],
            '3':['d','e','f'],
            '4':['g','h','i'],
            '5':['j','k','l'],
            '6':['m','n','o'],
            '7':['p','q','r','s'],
            '8':['t','u','v'],
            '9':['w','x','y','z']
        }
        queue = ['']  # 初始化队列
        print('len(queue):', len(queue)) # = 1

        # 队列
        for digit in digits:
            print('digit:',digit)
            for _ in range(len(queue)): # 队列非空
                print('len(queue):', len(queue))
                tmp = queue.pop(0) # 拿出第一个,最开始会是'',之后就是拼接的字母串
                for letter in digitDict[digit]:# 遍历该轮数字的字母
                    queue.append(tmp + letter) # 拼接字母,入队
        return queue


用队列模拟递归就相当于广度遍历,还可以用栈模拟递归相当于深度遍历。

下图来自LeetCode 刷题笔记——递归与回溯的理解
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值