回溯问题大致解法:首先确定递归终止条件,然后进行遍历首先将符合条件的放入临时变量,遍历的过程中会调用dfs,调用之后因为需要回溯,所以需要进行顶端元素的弹出。对于本题而言,需要将结果放在一个字符数组中,因此我们需要维护一个临时的字符类型的临时变量,每次将临时变量放入到最终的结果数组内。每次遍历到一个数字,就对这个数字对应的全部字符进行深度优先遍历,这里的index对应的就是digits中的每一个字符变量(也就是字符数组digits的下标)。对于每一个digits的数组的数字,都对应有三个或者四个字符,那么这些字符就是我们需要获取到的并将其放入到临时变量中。
class Solution {
public:
// 按照电话键进行元素的保存,这里使用哈希表
unordered_map<char, string> map = {
{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"},
{'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}
};
vector<string> res;
// 保存每一次的结果,然后添加到最终的字符串数组中
string tmp;
void dfs(int index, string digits)
{
// 递归终止条件
if(index == digits.size())
{
res.push_back(tmp);
return ;
}
// 根据第一个数字拿到对应的字母
for(int i = 0;i < map[digits[index]].size();++i)
{
// 将数字对应的字符存放起来
tmp.push_back(map[digits[index]][i]);
dfs(index + 1, digits);
tmp.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0)
return res;
dfs(0, digits);
return res;
}
};