使用回溯法,也就是深度优先搜索。首先用哈希表存储数字对应的字母。
然后进行回溯。递归函数从第一个数开始,第一个数对应的所有字母都遍历一遍,确定第一个字母后,开始遍历第二个数对应的字母。。。。递归函数的结束条件是遍历到给出数字的最后一个数,就将组合好的字符串放到vector数组里边。
class Solution {
private:
vector<string> res; //存储最终的返回结果
const string letterMap[10]{
"", //0 (程序运行过程中不会访问到,这里添加是为了访问letterMap的时候键盘的数字正好对应数组中的索引号)
" ", //1 (同上)
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz" //9
};
void findCombination(const string& digits, int index, const string& s){
if(index == digits.size()){
//保存结果
res.push_back(s);
return;
}
char c = digits[index]; //获取字符串中的指定位置的数字
string letters = letterMap[c -'0']; //获取上述数字对应的字母
for(int i =0; i < letters.size(); i++){ //遍历上述数字对应字母的每种可能性,然后对之后的数字字符串递归上述操作
findCombination(digits, index + 1, s + letters[i]);
}
}
public:
vector<string> letterCombinations(string digits) {
res.clear();
if(digits == "")
return res;
findCombination(digits, 0, "");
return res;
}
};