前言
LeetCode题目:LeetCode 216、17
Takeaway:回溯算法的思路和模板的应用,以及一部分的字符串处理技巧。
一、216
回溯的模板应用,回溯用起来越来越得心应手了。
class Solution {
public:
vector<vector<int>> ans;
vector<int> each;
void traverse(int start, int sum, int k, int n) {
if(sum > n){
return;
}
if(each.size() == k){
if(sum == n) {
ans.push_back(each);
}
return;
}
for(int i=start; i<=9; i++){
each.push_back(i);
sum+=i;
traverse(i+1, sum, k, n);
sum-=i;
each.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
traverse(1, 0, k, n);
return ans;
}
};
二、17
回溯模板+字符串处理,逻辑还是挺简单的。
class Solution {
public:
int depth;
vector<string> ans;
string each;
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
void traverse(string digits, int index) {
if(index == digits.size()){
ans.push_back(each);
return;
}
int curInt = digits[index] - '0';
for(int i=0; i<letterMap[curInt].size(); i++){
each.push_back(letterMap[curInt][i]);
traverse(digits, index+1);
each.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits == "") {
return ans;
}
traverse(digits, 0);
return ans;
}
};
总结
回溯算法的思路和模板的应用,以及一部分的字符串处理技巧。
回溯模板:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}