(python刷题)leetcode 第17题:电话号码的字母组合

题目在leetcode上的链接为:
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

题目描述
在这里插入图片描述

解题思路
这是一个排序组合的问题,可以使用回溯法的思想解题。
回溯法的思想是先自上到下,然后再一步步从下往上进行回溯。对于一个有多种解的问题,回溯法先按照其中的一种解法往最底层执行,执行完毕后再回到上一层执行下一种解法,知道找到所有满足条件的解。
在这一题中,我们构建一个回溯函数 backtrack(combination, nextdigits),combination 表示当前的字母组合,nextdigitis 表示接下来需要传入的数字,算法一次性传入一个数字,然后将这个数字对应的字母 letter 添加到组合中,即得到的组合为 combination + letter,直到不需要再有数字传入,则得到了所有的字母组合。

算法的步骤为:

  • 建立一个数字与对应字母的映射的字典
  • 初始化 combination=’’,建立回溯函数 backtrack(combination, nextdigits):
    • 如果 nextdigits 的长度为0,说明接下来没有数字传入,得到了一种字母组合
    • 否则,循环遍历传入的第一个数字 nextdigits[0] 对应的字母 letter:
      • 将字母添加到当前组合中,并继续回溯下去,即 backtrack(combination+letter, nextdigits[1:])

下面以题目中传入的数字 “23” 为例说明算法的执行步骤。
在这里插入图片描述
如上图所示,

  • 首先传入的第一个数字为 ‘2’,使用循环遍历 ‘2’ 对应的字母依次为 ‘a’,‘b’,‘c’
  • 在上面的第一次循环中,接下来继续执行 backtrack(combination+letter, nextdigits[1:]) 具体参数为 backtrack(’’ + ‘a’, ‘3’),传入的数字为 ‘3’,使用循环遍历 ‘3’ 对应的字母依次为 ‘d’,‘e’,‘f’。
  • 在上面的第一次循环中,接下来继续执行 backtrack(combination+letter, nextdigits[1:]) 具体参数为 backtrack(‘a’ + ‘d’, ‘’),此时 combination=‘ad’,没有可传入的数字,因此就得到了第一种组合 ‘ad’,backtrack(‘a’ + ‘d’, ‘’) 执行完毕。
  • 返回上一层函数 backtrack(’’ + ‘a’, ‘3’),继续执行循环的第二步,即 backtrack(‘a’ + ‘e’, ‘’)…直到所有组合都找到为止

可以看到回溯算法执行的步骤类似于树的深度优先搜索,对于数字 ‘23’,首先找到的第一个组合为 ‘ad’,然后回溯到上一层,继续执行找到 ‘ae’,然后接下来依次是 ‘af’,‘bd’,‘be’,‘bf’…

复杂度分析:
算法的时间复杂度为所有排序组合的数目,即 o ( 3 m 4 n ) o(3^m4^n) o(3m4n),在给定的数字字符串中,m 为对应三个字母的数字个数,n 为对应四个字母的数字个数
由于需要创建列表储存所有排序组合的结果,所以空间复杂度为 o ( 3 m 4 n ) o(3^m4^n) o(3m4n)

python代码

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        phone = {
            '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(combination, nextdigits):
            if len(nextdigits) == 0:
                output.append(combination)
            else:
                for letter in phone[nextdigits[0]]:
                    backtrack(combination + letter, nextdigits[1:])
        
        output = []
        if not digits:
            return []
        backtrack('', digits)

        return output

参考资料:
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode/
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/leetcode-17-letter-combinations-of-a-phone-number-/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 是一种流行的高级编程语言,因其简洁易读的语法和广泛的应用领域而受到开发者喜爱。LeetCode 是一个在线编程平台,专门用于算法和技术面试的准备,提供了大量的编程目,包括数据结构算法、系统设计等,常用于提升程序员的编程能力和解决实际问的能力。 在 Python 中刷 LeetCode 目通常涉及以下步骤: 1. **注册账户**:首先在 LeetCode 官网 (https://leetcode.com/) 注册一个账号,这样你可以跟踪你的进度和提交的代码。 2. **选择语言**:登录后,在个人主页设置中选择 Python 作为主要编程语言。 3. **学习和理解目**:阅读目描述,确保你理解问的要求和预期输出。目通常附有输入示例和预期输出,可以帮助你初始化思考。 4. **编写代码**:使用 Python 编写解决方案,LeetCode 提供了一个在线编辑器,支持实时预览和运行结果。 5. **测试和调试**:使用给出的测试用例来测试你的代码,确保它能够正确地处理各种边界条件和特殊情况。 6. **提交答案**:当代码完成后,点击 "Submit" 提交你的解法。LeetCode 会自动运行所有测试用例并显示结果。 7. **学习他人的代码**:如果遇到困难,可以查看社区中的其他优秀解法,学习他人的思路和技术。 8. **反复练习**:刷题不是一次性的事情,通过反复练习和优化,逐渐提高解速度和代码质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值