题目背景:
========================================================================================================
解法:回溯算法 代码随想录的解法
理解回溯的思想:
以输入’12’为例 “2-abc”,”3-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
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<stack>
#include<queue>
//回溯解法
class Solution
{
private:
const string letterMap[10] //自己封装号码对应的数字 是不可更改的
{
"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" ///对应 0 1 2 3 4 5 6 7 8 9
};
public:
vector<string>res;//保存最终的字母组合
string str;//保存临时的字母组合
void backtracking(const string& digits, int index)//index是下标 从0开始
{
if (index == digits.size())
{
res.push_back(str);
return;
}
int digit = digits[index] - '0';//先找到2键上对应的字母
string letters = letterMap[digit];
for (int i = 0; i < letters.size(); i++)//先递归的遍历第一个数字对应的字母 每遍历到一个字母 就开始遍历第二个数字对应的字母 依次组成字母组合
{
str.push_back(letters[i]);
backtracking(digits, index + 1);
str.pop_back();//回溯
}
}
vector<string>letterCombinations(string digits)//digits是输入的字母组合 输入 23
{
if (digits.size() == 0)return res;
backtracking(digits, 0);
return res;
}
};
int main()
{
string digits = "45";
Solution so;
vector<string>ans;
ans = so.letterCombinations(digits);
cout << "输出所有的字母组合:" << endl;
for (auto it = ans.begin(); it != ans.end(); it++)
{
cout << *it << endl;;
}
system("pause");
return 0;
}