17. 电话号码的字母组合
一、题目难度
中等
二、相关标签与相关企业
[相关标签]
[相关企业]
三、题目描述
给定一个仅包含数字2 - 9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。
给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。
(此处可根据实际情况补充电话按键数字与字母的映射表格,例如:
数字 | 对应字母 |
---|---|
2 | abc |
3 | def |
4 | ghi |
5 | jkl |
6 | mno |
7 | pqrs |
8 | tuv |
9 | wxyz |
四、示例
示例1
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例2
输入:digits = ""
输出:[]
示例3
输入:digits = "2"
输出:["a","b","c"]
五、提示
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
class Solution:
def letterCombinations(self, digits: str) -> List[str]:
# 特解
if not digits:
return []
# 定义回溯函数的参数
# 数字到字母的映射字典
letter_map = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz',
}
result = [] # 结果列表
path = "" # 每个结果
def backtracking(digits, index, path, result, letter_map):
"""
回溯函数
:param digits: 给定字符串包含2~9,这是我们要生成字母组合的基础输入
:param index: 用于记录当前正在处理的数字在字符串中的索引位置,
控制回溯进度,知道我们处理到哪个数字
:param path:记录当前正在生成的一种字母组合情况
:param result: 所有字母组合结果
:param letter_map: 字典,存储映射关系
"""
# 设置回溯终止条件:处理完digits的所有数字后就终止
if index == len(digits):
# 将当前结果放入result就返回
result.append(path)
return
# 如果index没到末尾,根据当前的index获取digits字符串中对应的数字digit
digit = digits[index]
# 获取到index位置的数字后,就可以用字典映射到对应的字符串
# 循环遍历该字符串的所有字符(字母),
for letter in letter_map[digit]:
# 将当前字母letter加入到当前结果path,
path += letter
# 加入了一个了!进入下一层递归探索
backtracking(digits, index + 1, path, result, letter_map)
# 完成一轮操作,此时进行关键的一步,回溯
# 将path的最后一个字母弹出!恢复到添加该字母之前的状态
# 以便能够尝试下一个字母的选择
path = path[:-1]
# 启动回溯过程,初始时index为0
backtracking(digits, 0, path, result, letter_map)
return result
以下是使用回溯法求解“17. 电话号码的字母组合”问题的思路及Python代码实现:
回溯法思路
1. 确定解空间
本题的解空间就是给定的仅包含数字2 - 9的字符串 digits
所能表示的所有字母组合情况。由于每个数字都对应着几个字母,通过不同数字对应的字母进行组合,就可以得到所有可能的字母组合,这就是我们要通过回溯法去搜索的解空间。
2. 定义回溯函数及其参数
- 函数名:定义一个名为
backtracking
的函数来实现回溯过程。 - 参数:
digits
:给定的仅包含数字2 - 9的字符串,这是我们要生成字母组合的基础输入。index
:用于记录当前正在处理的数字在digits
字符串中的索引位置。它的作用是控制回溯的进度,知道我们已经处理到哪个数字了,以便根据该数字对应的字母进行组合操作。path
:用于记录当前正在生成的一种字母组合情况,初始为空字符串,随着回溯过程不断添加字母,当处理完所有数字对应的字母后,就得到了一种完整的字母组合。result
:用于存储最终所有的字母组合结果,初始为空列表,在回溯过程中,每当得到一种新的字母组合,就将其添加到result
中。letter_map
:这是一个字典,用于存储数字到字母的映射关系,例如{2: 'abc', 3: 'def',...}
,方便在回溯过程中根据数字获取对应的字母。
3. 设置回溯函数的终止条件
当 index
的值等于 digits
字符串的长度时,说明已经处理完了所有数字对应的字母,此时就得到了一种完整的字母组合,将当前的 path
添加到 result
中,然后返回,结束当前层的递归。
4. 实现回溯搜索的遍历过程
- 在
backtracking
函数内部,首先根据当前的index
获取digits
字符串中对应的数字digit
。然后通过遍历letter_map[digit]
中该数字对应的所有字母:- 对于每个字母,将其添加到
path
中,表示选择了该字母作为当前字母组合的一部分。 - 然后调用
backtracking
函数自身进行递归,进入下一层搜索,此时传递的参数中,digits
不变,index
更新为index + 1
,表示处理下一个数字,path
是更新后的状态(已添加了当前选择的字母),result
不变,letter_map
也不变。 - 在递归调用返回后(即完成了下一层的搜索),需要进行回溯操作,将
path
中的最后一个字母弹出,恢复到添加该字母之前的状态,以便能够尝试下一个字母的选择,继续生成其他可能的字母组合。
- 对于每个字母,将其添加到
在上述代码中:
- 首先判断如果输入的
digits
为空字符串,直接返回空列表。 - 然后创建了数字到字母的映射字典
letter_map
。 - 接着初始化了
result
(用于存储最终结果)和path
(用于记录当前字母组合情况)。 - 定义了
backtracking
函数,在函数内部按照上述回溯法的思路进行操作,通过循环遍历、选择字母、递归和回溯等步骤,最终得到所有的字母组合并存储在result
中。 - 最后返回
result
,即为给定字符串digits
所能表示的所有字母组合。