题目:电话号码的字母组合

题目分析
题目要求
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合(答案可以按任意顺序返回)。数字到字母的映射与电话按键相同(如 2 对应 abc,3 对应 def 等)。
示例
- 示例 1:输入
digits = "23",输出["ad","ae","af","bd","be","bf","cd","ce","cf"]。 - 示例 2:输入
digits = "2",输出["a","b","c"]。
解题思路
这道题可以通过 ** 深度优先搜索(DFS)** 来解决,属于典型的 "组合枚举" 类问题。
核心思路
对于输入字符串中的每一个数字,我们需要枚举其对应的所有字母,并将这些字母与后续数字的字母进行组合。具体来说:
- 首先建立数字到字母的映射表。
- 从第一个数字开始,递归地枚举每个数字对应的所有字母,将字母加入临时组合字符串中。
- 当递归到输入字符串的末尾时,将当前的临时组合字符串加入结果集。
代码详解
数据结构与全局变量
vector<string> ret:用于存储最终的所有字母组合结果。string path:用于存储递归过程中的临时字母组合(类似 "路径")。vector<string> bor:数字到字母的映射表,bor[0]和bor[1]无意义(因为题目中数字是2-9),bor[2] = "abc"对应数字2的字母,以此类推。
cpp
class Solution {
public:
vector<string> ret;
string path;
vector<string> bor = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
DFS 递归函数
dfs 函数负责递归枚举所有可能的字母组合,参数 pos 表示当前处理到输入字符串 digits 的第几个字符,nums 是输入的数字字符串。
cpp
void dfs(int pos, string nums) {
// 递归终止条件:当处理完所有数字时,将当前路径加入结果集
if (pos == nums.size()) {
ret.push_back(path);
return;
}
// 获取当前数字(将字符转换为数字)
int n = nums[pos] - '0';
// 枚举当前数字对应的所有字母
for (int i = 0; i < bor[n].size(); i++) {
// 选择:将当前字母加入路径
path.push_back(bor[n][i]);
// 递归:处理下一个数字
dfs(pos + 1, nums);
// 回溯:撤销选择,以便枚举下一个字母
path.pop_back();
}
}
完整代码:
cpp
class Solution {
public:
vector<string>ret;
string path;
vector<string> bor={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void dfs(int pos,string nums)
{
if(pos==nums.size())
{
ret.push_back(path);
return;
}
int n=nums[pos]-'0';
for(int i=0;i<bor[n].size();i++)
{
path.push_back(bor[n][i]);
dfs(pos+1,nums);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0)
return ret;
dfs(0,digits);
return ret;
}
};