Skip to main content

17.电话号码的字母组合

标签: string, backtracking

难度: Medium

通过率: 62.47%

原题链接: https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/

题目描述

给定一个包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。每个数字对应的字母如下所示(类似电话键盘)。注意1不对应任何字母。

解题思路

这个问题可以用回溯法来解决。由于数字与字母之间的对应关系是确定的,我们可以使用一个哈希表来存储这种映射关系。对于输入的每一位数字,我们可以递归地找出当前数字对应的所有字母,并尝试将这些字母与之前的组合进行拼接。当递归遍历完所有数字后,我们就得到了一种完整的组合,并可以将其加入结果集中。

代码实现

def letterCombinations(digits):
# 数字到字母的映射
phone = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl',
'6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}

# 如果输入为空,则返回空列表
if not digits:
return []

# 结果列表
result = []

# 回溯算法
def backtrack(combination, next_digits):
# 如果没有更多的数字要处理,完成当前组合
if not next_digits:
result.append(combination)
else:
# 处理下一个数字对应的所有可能字母
for letter in phone[next_digits[0]]:
backtrack(combination + letter, next_digits[1:])

# 从空组合开始处理所有输入的数字
backtrack("", digits)
return result

复杂度分析

时间复杂度:给定数字的数量为nn,每个数字对应最多4个字母,故总时间复杂度为O(4n)O(4^n)。因为每个数字需各自的组合。空间复杂度:使用O(n)O(n)的辅助空间储存当前的组合。