从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1 :
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入: digits = ""
输出: []
示例 3:
输入: digits = "2"
输出: ["a","b","c"]
提示:
0 <= digits.length <= 4digits[i]是范围['2', '9']的一个数字。
二、思路分析
在看到这道题后,我是比较凌乱的。首先一个问题,这是有多个不同的集合,在每个集合中挑一个字母进行组合。那么k应该为digits的长度。但如何控制k呢?这么一想脑子就有些乱了。
这题我没做出来的地方也就在这里,之前的组合回溯题目都是在同一个集合里进行数字的挑选,那么k的控制也就是在每次递归的参数传递中使start为i+1即可。
然后我去看了就解析视频,才明白其实很简单,同样是设置了1个index,但这个index不同于之前的startindex,之前的startindex是为了记录每一次递归在集合中到哪个位置了。但这次的index记录的是到哪一个集合了。
同时我才知道原来字符串也可以使用pop_back和push_back。
三、AC代码
class Solution {
public:
vector<string>ans;
string path="";
vector<string> board={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void backtracking(string digits,int n,int start){
if(path.size()==n){
ans.push_back(path);
return;
}
int digit=digits[start]-'0';
string latter=board[digit];
for(int i=0;i<latter .size();i++){
path+=latter[i];
backtracking(digits,n,start+1);
path=path.substr(0, path.size()-1);
}
}
vector<string> letterCombinations(string digits) {
int n=digits.size();
if(n==0){
return ans;
}
backtracking(digits,n,0);
return ans;
}
};
四、总结
对回溯算法的理解又精进了一分。