
思路:
先考虑只输入一个数字的情况,例如digits=“2”,只需遍历一遍“abc“即可。
for i in "abc"{
//伪代码
push_back(i);
}
若digits=“23”,就要经历两次遍历。
//伪代码
for i in "abc"{
for j in "def"{
push_back(ij);
}
}
不难发现,digits有几个数字,就有几层循环层数,但是我们的代码的循环层数又不能改变,怎么办呢?这里就可以用递归来解决,递归的深度就是digits的数字个数,递归内部再用循环来遍历每个数字对应映射的所有字母。
如下图所示:digits="234"
完整代码如下:
class Solution {
public:
void sstr(string& digits, int i, vector<string>& ans, string& res) {
//int i 记录的是当前的递归深度
if (i == digits.size()) return;//递归结束条件
static vector<string>v1 = { " ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
for (int j = 0; j < v1[digits[i] - '0'].size(); ++j) {
//循环来遍历每个数字对应映射的所有字母。
res[i] = v1[digits[i] - '0'][j];
sstr(digits, i + 1, ans, res);
if (i == digits.size() - 1) {
//每次递归到最底层,将res存到vector里
ans.push_back(res);
}
}
}
vector<string> letterCombinations(string digits) {
vector<string> ans;
string res(digits.size(), 'x');
//先将res的空间预留出来,随便用一个字母填充,反正后面都会被覆盖掉,这里先用‘x’填充
//res用来临时存每次的字母组合
sstr(digits, 0, ans, res);
return ans;
}
};
那么本期内容就到这里了,觉得有收获的同学们可以给个点赞、关注、收藏哦,谢谢大家。
792

被折叠的 条评论
为什么被折叠?



