题目如下所示:
一开始的想法是通过循环遍历算法,但是每次循环的次数,由于每个数字包含的字母并不相同,所以会很麻烦。于是想到了使用递归的思想,但是由于本身递归算法使用的不够熟练,所以并没有写出成功的代码,参考了题解中一位大哥的代码。
这个里面我需要认识到的是,所谓递归就是很多循环,那么本题的思路就是将每个循环中的字符单独相加。参考代码如下,更好理解:
class Solution {
public:
vector<string> ans; // 设为全局变量,方便helper函数引用
vector<string> sList={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //字符表,注意不能用括号声明
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return {}; // 特判
helper(digits, {}, 0);
return ans;
}
void helper(string digits, string s, int idx){
if(idx==digits.size()){ // 回溯条件,保证digits全部被扫描
ans.push_back(s); // 将一种结果压入ans
return;
}
else{
// 依据digits的位数进行迭代,例如digits="234"
// 第一层迭代为"2",将遍历对应的字符串"abc"并更新字符串,依次为"a","b","c"
// 第二层迭代为"3",将遍历对应的字符串"def"并更新字符串,若上一层迭代为"a",则添加、更新为"ad", "ae"与"af".
int pos=digits[idx]-'0'; // 获取idx在digits的字符,如“2”对应的2
string tmpStr=sList[pos]; // 获取下标pos对应的字符串,如2对应的"abc"
for(int i=0;i<tmpStr.size();i++){
helper(digits,s+tmpStr[i],idx+1); // 进行下一层迭代,注意同一层迭代时不改变s和idx等参数值
}
}
}
};