回溯 17 - 39
现在开始按大类做题,参照 花花酱Huahua 整理的分类 集合 去刷题
今天这两道题都是以前做过的。。。
17. 电话号码的字母组合 - medium
//13.48
//14.01
class Solution {
vector<string> ans;
vector<string> letter;
void helper(int i, string &digits, string str) {
if(i == digits.size()) {
//cout << str << endl;
ans.push_back(str);
return ;
}
int num = digits[i]-'0';
for(int k = 0; k < letter[num].size(); k++) {
str = str + letter[num][k];
helper(i+1, digits, str);
str.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
letter.resize(10);
letter[2] = "abc";
letter[3] = "def";
letter[4] = "ghi";
letter[5] = "jkl";
letter[6] = "mno";
letter[7] = "pqrs";
letter[8] = "tuv";
letter[9] = "wxyz";
helper(0, digits, "");
return ans;
}
};
39. 组合总和 - medium
//15.15
//15.27
class Solution {
vector<vector<int>> ans;
void helper(vector<int> &candidates, int target, vector<int> tmp, int k) {
if(target == 0) {
ans.push_back(tmp);
return ;
}
if(target < 0) return ;
for(int i = k; i < candidates.size(); i++) {
tmp.push_back(candidates[i]);
//target -= candidates[i];
helper(candidates, target-candidates[i], tmp, k);
tmp.pop_back();
k++;
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int len = candidates.size();
if(len == 0) return {};
//sort(candidates.begin(), candidates.end());
helper(candidates, target, {}, 0);
return ans;
}
};