力扣HOT100之回溯:17. 电话号码的字母组合
这道题自己A的,感觉这道题的思路就是用一个二重循环来遍历,外层循环用于遍历输入字符串digits
的每一个数字字符,内层循环则遍历每一个数字字符对应的字母字符,我们定义一个全局变量path
来存储每一种可能的结果,递归函数的输入参数有原始字符串digits
和当前遍历到的数字字符下标start_index
,start_index
则替代了外层循环的作用,递归函数的主体部分的二重循环退化为一重循环,该一重循环则负责将digits[start_index]
处的所有可能的字符都遍历一遍,每一种可能的字符添加到path
末尾后,直接将start_index + 1
,然后递归调用递归函数,当递归调用结束后,直接从path
弹出最后一个元素。
class Solution {
public:vector<string> result;string path = "";unordered_map<int, string> Hash = {{2, "abc"}, {3, "def"}, {4, "ghi"}, {5, "jkl"},{6, "mno"}, {7, "pqrs"}, {8, "tuv"}, {9, "wxyz"}}; //建立数字与字符的映射vector<string> letterCombinations(string digits) {backtracking(digits, 0);return result;}void backtracking(string digits, int start_index){if(path.size() == digits.size() && path.size() > 0){ //所有数字映射完毕result.push_back(path);return ;}//递归主体for(int i = 0; i < Hash[digits[start_index] - '0'].size(); i++){path += Hash[digits[start_index] - '0'][i];backtracking(digits, start_index + 1);path.pop_back();}}
};