39. 组合总和
- 参数和返回值: 集合candidates, 和目标值target,总和sum,起始位置startindex。void
- 递归终止条件:sum>target返 ,sum==target将path压入result
- 单层搜索逻辑:用i遍历集合,sum,path压入,回溯,弹出
- 加入剪枝:在for循环中,sum + candidates[i])已经大于target,就可以结束遍历。并且在主函数中排序。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {
if (sum == target) {
result.push_back(path);
return;
}
// 如果 sum + candidates[i] > target 就终止遍历
for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i);
sum -= candidates[i];
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
result.clear();
path.clear();
sort(candidates.begin(), candidates.end()); // 需要排序
backtracking(candidates, target, 0, 0);
return result;
}
};
40.组合总和II
本题的难点在于区别2中:集合(数组candidates)有重复元素,但还不能有重复的组合。
区别树枝去重:两个数值相同的元素可以放入集合中
树层去重:前面使用过的元素不能再用了,不然会重复。设置uesd标记是否用过

131.分割回文串
回溯三部曲
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
- 参数返回值:子串s,标记startindex.void
- 终止条件:标记点大于子串长度
- 单层递归:for遍历子串,是回文子串 插入 不是跳过,递归,弹出
判断回文子串
双指针
bool isPalindrome(const string& s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
if (s[i] != s[j]) {
return false;
}
}
return true;
}
209

被折叠的 条评论
为什么被折叠?



