leetcode17.电话号码的数字组合(题目详解)
题目链接

思路:
先考虑只输入一个数字的情况,例如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;}
};
那么本期内容就到这里了,觉得有收获的同学们可以给个点赞、关注、收藏哦,谢谢大家。
