这个题解使用回溯算法来解决电话号码的字母组合问题。首先,定义了一个字典 m,将数字映射到对应的字母。然后定义一个辅助函数 backtrack,它接受一个路径参数 path。在函数中,如果 path 的长度等于 digits 的长度,说明找到了一个完整的字母组合,将其加入答案列表 ans 中。否则,根据当前 path 的长度,从 digits 中取出对应的数字,并获取该数字对应的字母选择。遍历这些字母选择,将每个字母加入 path,递归调用 backtrack,然后在回溯时将该字母从 path 中移除。最后,在主函数中调用 backtrack([]),并返回答案列表 ans。
时间复杂度: O(m^n * n)
空间复杂度: O(m^n * n)
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
if digits == "":
return []
# 定义数字到字母的映射
m = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
}
ans = []
def backtrack(path):
# 如果 path 的长度等于 digits 的长度,说明找到了一个完整的字母组合
if len(path) == len(digits):
ans.append(''.join(path))
return
# 获取当前位置的数字对应的字母选择
choices = m[digits[len(path)]]
# 遍历字母选择,递归生成字母组合
for char in choices:
path.append(char)
backtrack(path)
path.pop() # 回溯,移除当前选择的字母
backtrack([])
return ans