「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
17. 电话号码的字母组合
题目描述
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
复制代码
示例 2:
输入: digits = ""
输出: []
复制代码
示例 3:
输入: digits = "2"
输出: ["a","b","c"]
复制代码
解析
回溯法
- 首先需要一个字符串数组
vector<string> result
来存放结果,同时还需要一个字符串s
来存放叶子结点的值 - 确定递归函数的参数和返回值
- 参数:字符串,指向数字的索引(用来统计访问到第几个数,index在这里该表示树的深度)
- 确定终止条件
- 如果
index
等于输入的数字个数digits.size()
,则将s
添加到结果集result
中
- 如果
- 确定单层循环的逻辑
- 取Index指向的数字,找到对应的字符串
- for循环处理这个字符串
代码
class Solution
{
public:
vector<string> letterCombinations(string digits)
{
if (digits == "")
{
return result;
}
backtracking(digits,0);
return result;
}
private:
// 结果集
vector<string> result;
// 记录叶子节点
string s;
// 定义数字和字符串的映射
const string letterMap[10] = {
"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz", //9
};
// 这里的index不是 组合问题里面的 startIndex
// index指向数字,表示遍历到第几个数字了,还表示树的深度
void backtracking(const string &digits, int index)
{
// Index等于字符串的大小时
if (index == digits.size())
{
result.push_back(s);
return;
}
// 将index指向的数字转换成int类型
int digit = digits[index] - '0';
// 取出数字对应的字符串
string letter = letterMap[digit];
// 对字符串进行遍历
for (int i = 0; i < letter.size(); i++)
{
s.push_back(letter[i]);
// 下一层处理下一个数字
backtracking(digits, index + 1);
s.pop_back(); // 回溯
}
}
};
复制代码