题目背景:
========================================================================================================
解法:回溯算法 代码随想录的解法
理解回溯的思想:
以输入’12’为例 “1-abc”,”2-def”,输出“ad ae af bd be bf cd ce cf”
首先进入回溯过程,找到第一个数字1对应的第一个字母a,当遍历到a时,开始找2对应的字母组合,一直递归找到组合ad ae af ;
后开始找第一个数字对应的字母b,开始找2对应的字母组合,一直递归找到bd be bf;
后开始找第一个数字对应的字母c,开始找2对应的字母组合,一直递归找到cd ce cf
class Solution
{
private:
//封装1-10个按键上的字母
const string letterMap[10]
{
"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"
};
public:
vector<string>res;//用于存储最终的字母组合
string s;//用于暂存字母
//回溯算法
void backtracking(const string& digits, int index) //输入一个数字组合 例如;输入"12" 输出"ab"
{
//回溯终止
if (index == digits.size())//index表示字母组合的字母个数,是不断增加的
//最后输出的字母组合的字母个数和输入数字组合的数字个数一样
{
res.push_back(s);
return;
}
int digit = digits[index] - '0';//字符串转整数 找到数字组合中的第一个数字
string letters = letterMap[digit];//找到数字键上对应的字母组合;
//一个数字对应的是一个字母组合
//遍历每一个字母
for (int i = 0; i < letters.size(); i++)
{
s.push_back(letters[i]);//将第一个数字对应的第一个字母
backtracking(digits, index + 1);//开始找第二个数字对应的字母 找到两个字母的组合后开始返回
s.pop_back();//
}
}
vector<string>letterCombninations(string digits)//输入数字组合
{
s.clear();
res.clear();
if (digits.size() == 0)
{
return res;
}
backtracking(digits, 0);//将字母组合的字母个数初始化为0
return res;
}
};