这道题注意两个点。一是根据题目所给的键盘布局进行数字到英文字符串的映射,这一步可以用二维数组实现。二是这道题在递归的时候不需要缩小范围,这与之前写的组合题目有所不同。此题并不是在一个集合中不断递归遍历,而是递归另一个集合,所以不需要考虑递归时集合大小的改变。还有就是,虽然这道题是在完全不同的集合中递归(天然就考虑了组合的无序性),但是我们仍需要设置一个变量来控制for循环,保证每一次递归所遍历的集合在改变。大家可以结合下面的代码及详细注释理解此题。
代码及详细注释如下:
class Solution {
public://用二维数组映射数字按键对应的字符串const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};//存储结果的容器vector<string> result;string s;void backtracking(int index,string digits){//递归终止条件:当找到满足个数的字符串组合时,退出递归if(s.size() == digits.size()){result.push_back(s);return; }int num = digits[index] - '0';//循环遍历当前集合for(int i = 0;i < letterMap[num].size();i++){s.push_back(letterMap[num][i]);//递归另一个集合backtracking(index + 1,digits);//回溯:将已经放入的字母弹出s.pop_back();}}vector<string> letterCombinations(string digits) {//优先考虑特殊情况if (digits.size() == 0) {return result;}//一般情况backtracking(0,digits);return result;}
};