文章目录
题目
回溯:17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = "2"
输出:["a","b","c"]
提示:
1 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
代码
cpp
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string>res;
if(digits.length()==0){
return res;
}
string tmp;
unordered_map<char,string>u_map{
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
dfs(res,digits,0,tmp,u_map);
return res;
}
void dfs(vector<string>&res,string &digits,int index,string &tmp,unordered_map<char,string>&u_map){
if(index==digits.length()){
res.push_back(tmp);
return;
}
for(auto c:u_map[digits[index]]){
tmp.push_back(c);
dfs(res,digits,index+1,tmp,u_map);
tmp.pop_back();
}
}
};
原理图

原理解释
提示:算法流程及解释在代码中已标注
1、 边界条件
首先判断输入字符串 digits 是否为空,若为空直接返回空结果集 res,避免无效计算。
2、数字与字母的映射
使用哈希表 unordered_map 存储电话键盘上数字到对应字母的映射:
2:abc,3:def,4:ghi,5:jkl,6:mno,7:pqrs,8:tuv,9:wxyz
方便快速通过数字字符查找对应的字母集合。
- 临时存储
临时字符串 tmp:存储当前拼接的字母组合
结果集 res:用于存储所有符合要求的最终字母组合。
- 深度优先搜索(DFS)
调用递归函数 dfs,传入参数:结果集、输入数字串、当前遍历的数字下标(初始为 0)、临时字符串、字母映射表。
遍历所有数字,为每个数字选择一个字母,拼接成完整组合。
- DFS 递归终止条件
当递归下标 index 等于输入数字串的长度时,说明已经遍历完所有数字,完成了一次完整的字母拼接。
将此时的临时字符串 tmp 加入结果集 res,然后返回,结束当前递归分支。
- 递归遍历 + 回溯核心逻辑
取出当前下标对应数字的所有字母,循环遍历每一个字母:
选择字母:将当前字母添加到临时字符串 tmp 末尾(拼接组合)。
递归深入:下标 + 1,处理下一个数字,继续拼接字母。
回溯撤销:递归返回后,删除 tmp 末尾的字母(撤销当前选择),尝试循环中的下一个字母。
- 最终返回结果
所有递归分支执行完毕后,结果集 res 中存储了所有可能的字母组合,直接返回即可。