LeetCode【0017】电话号码的字母组合

时间:2024-11-13 10:09:46

本文目录

  • 1 中文题目
  • 2 最优解法:迭代法
    • 2.1 方法思路
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 题目总结

1 中文题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
**说明:**

示例:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]
输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 ≤ d i g i t s . l e n g t h ≤ 4 0 \leq digits.length \leq 4 0digits.length4
  • 2 ≤ d i g i t s [ i ] ≤ 9 2 \leq digits[i] \leq 9 2digits[i]9

2 最优解法:迭代法

2.1 方法思路

方法核心

每处理一个数字,就将当前所有可能的组合与这个数字对应的字母进行组合,得到新的所有可能组合。

实现步骤

  • 初始化一个只包含空字符串的结果列表 result = []
  • 遍历输入的每个数字,对于每个数字:
    • 获取该数字对应的所有可能字母
    • 将已有的每个组合与当前数字的每个字母进行拼接,形成新的组合

方法示例

以输入"23"为例说明过程:

  • 处理’2’时:result = [] → [‘a’, ‘b’, ‘c’]
  • 处理’3’时:[‘a’, ‘b’, ‘c’] → [‘ad’, ‘ae’, ‘af’, ‘bd’, ‘be’, ‘bf’, ‘cd’, ‘ce’, ‘cf’]

2.2 Python代码

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        # 处理空输入
        if not digits:
            return []
            
        # 数字到字母的映射字典
        digit_map = {
            '2': 'abc',
            '3': 'def',
            '4': 'ghi',
            '5': 'jkl',
            '6': 'mno',
            '7': 'pqrs',
            '8': 'tuv',
            '9': 'wxyz'
        }
        
        # 存储结果
        result = ['']
        
        # 遍历每个数字
        for digit in digits:
            # 临时列表存储新的组合
            new_result = []
            # 获取当前数字对应的字母
            letters = digit_map[digit]
            # 遍历现有的组合
            for combo in result:
                # 将当前数字对应的每个字母添加到现有组合中
                for letter in letters:
                    new_result.append(combo + letter)
            # 更新结果列表
            result = new_result
            
        return result

2.3 复杂度分析

  • 时间复杂度: O ( 4 n ) O(4^n) O(4n) n n n是输入数字的长度
    • 每个数字最多对应 4 4 4个字母
    • 每次迭代产生的组合数呈指数增长
  • 空间复杂度: O ( 4 n ) O(4^n) O(4n)
    • 需要存储所有可能的组合
    • 空间占用主要在结果列表

3 题目总结

题目难度:中等
数据结构:数组
应用算法:迭代法