void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表);
回溯,撤销处理结果
}
}
39. 组合总和
题目链接
文章讲解
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
int sum = 0;
void solve(int target, int n, int start, int sum, vector<int>& candidates) {
if (sum > target) {
return;
}
if (sum == target) {
ans.push_back(path);
return;
}
for (int i = start; i < n; i++) {
path.push_back(candidates[i]);
sum += candidates[i];
solve(target, n, i, sum, candidates);
sum -= candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int n = candidates.size();
solve(target, n, 0, 0, candidates);
return ans;
}
};
40. 组合总和 II
题目链接
文章讲解
class Solution {
public:
vector<vector<int>> ans;
vector<int> path;
void solve(int target, vector<int>& candidates, int sum, int start) {
if (sum > target) {
return;
}
if (sum == target) {
ans.push_back(path);
return;
}
for (int i = start; i < candidates.size(); i++) {
if (i > start && candidates[i] == candidates[i - 1]) {
continue;
}
path.push_back(candidates[i]);
sum += candidates[i];
solve(target, candidates, sum, i + 1);
sum -= candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
solve(target, candidates, 0, 0);
return ans;
}
};
131. 分割回文串
题目链接
文章讲解
class Solution {
public:
vector<vector<string>> ans;
vector<string> path;
bool isPalindrome(string& s, int start, int end) {
while (start < end) {
if (s[start] != s[end]) return false;
start++;
end--;
}
return true;
}
void dfs(string& s, int start) {
if (start == s.size()) {
ans.push_back(path);
return;
}
for (int i = start; i < s.size(); i++) {
if (isPalindrome(s, start, i)) {
path.push_back(s.substr(start, i - start + 1));
dfs(s, i + 1);
path.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
dfs(s, 0);
return ans;
}
};