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)\)。