跳转至

17. 电话号码的字母组合

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入: digits = "23"

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

示例 2:

输入: digits = ""

输出: []

示例 3:

输入: digits = "2"

输出: ["a","b","c"]

题解

Go
var mapping = [...]string{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}

func letterCombinations(digits string) (ans []string) {
    n := len(digits)
    if n == 0 {
        return
    }
    path := make([]byte, n) // 注意 path 长度一开始就是 n,不是空列表
    var dfs func(int)
    dfs = func(i int) {
        if i == n {
            ans = append(ans, string(path))
            return
        }
        for _, c := range mapping[digits[i]-'0'] {
            path[i] = byte(c) // 直接覆盖
            dfs(i + 1)
        }
    }
    dfs(0)
    return
}
Python
MAPPING = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        n = len(digits)
        if n == 0:
            return []
        ans = []
        path = [''] * n  # 注意 path 长度一开始就是 n,不是空列表
        def dfs(i: int) -> None:
            if i == n: # 边界条件
                ans.append(''.join(path))
                return
            for c in MAPPING[int(digits[i])]: # 非边界条件, 枚举第 i 个字符是什么?
                path[i] = c  # 直接覆盖
                dfs(i + 1)
        dfs(0)
        return ans

复杂度

  • 时间复杂度: \(O(n \ 4^n)\),其中 \(n\)\(digits\) 的长度。
  • 空间复杂度: \(O(n)\)

参考