返回

LeetCode刷题笔记:第17题「电话号码的字母组合」彻底搞定!

前端

  1. 题目背景与基本概念

在现实生活中,我们经常需要使用电话拨号盘来拨打号码。每个数字键上都有多个字母,当我们输入一个数字时,可以按顺序选择这些字母中的任意一个。例如,数字键「2」上分别对应着字母「A」、「B」和「C」。

LeetCode第17题「电话号码的字母组合」就是一道与电话拨号盘相关的经典题目。题目如下:

给定一个仅包含数字 2-9 的字符串,返回该字符串的所有字母组合。

例如,对于输入字符串「23」,其字母组合为:

["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

02. 解题思路与算法流程

要解决这道题,我们需要采用回溯算法(Backtracking Algorithm)的思想。回溯算法是一种用于解决问题和生成所有可能的解决方案的递归算法。它通过不断尝试不同的解决方案来搜索所有可能的解决方案,并最终找到最佳或最优的解决方案。

在解决这道题时,我们可以将电话拨号盘上的数字看成一个决策树。每个数字键上的字母就是这个决策树的一个分支。我们从根节点(即第一个数字键)开始,依次遍历决策树,并在每个分支上做出选择(即选择某个字母)。当我们遍历到叶子节点(即最后一个数字键)时,就得到了一种可能的字母组合。然后,我们回溯到上一个分支,继续探索其他可能的字母组合。

03. 代码实现与详细讲解

以下是使用Python语言实现的代码:

def letterCombinations(digits):
    # 定义一个字典来存储数字键与字母的对应关系
    phone_map = {
        "2": "abc",
        "3": "def",
        "4": "ghi",
        "5": "jkl",
        "6": "mno",
        "7": "pqrs",
        "8": "tuv",
        "9": "wxyz"
    }

    # 定义一个结果列表来存储所有的字母组合
    result = []

    # 定义一个回溯函数
    def backtrack(combination, index):
        # 如果已经遍历到最后一个数字键,则将组合添加到结果列表中
        if index == len(digits):
            result.append(combination)
            return

        # 获取当前数字键对应的字母
        letters = phone_map[digits[index]]

        # 遍历当前数字键对应的所有字母
        for letter in letters:
            # 将当前字母添加到组合中
            combination += letter

            # 递归调用回溯函数,继续遍历下一个数字键
            backtrack(combination, index + 1)

            # 从组合中移除当前字母
            combination = combination[:-1]

    # 调用回溯函数,开始遍历决策树
    backtrack("", 0)

    # 返回结果列表
    return result

04. 运行结果与示例展示

对于输入字符串「23」,代码将输出以下结果:

["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]

对于输入字符串「79」,代码将输出以下结果:

["pws", "pwu", "pwv", "pxt", "pxu", "pxv", "pys", "pyu", "pyv", "qws", "qwu", "qwv", "qxt", "qxu", "qx