39. 组合总和
这个题与昨天第一题的区别就只有下面这一句(从i+1改成了i),下面这一句就确保了一个数字可以重复使用,但是又不会出现重复的结果,这个要根据树形图理解下
另外这个题减枝的方法是先排序然后再剪纸;这样的话如果上一层递归的sum已经大于或者等于target,就直接跳出这个循环;
下面这句话是终止本层遍历
40.组合总和II
这个题也是要排序后再做;在回溯的过程中used数组会被重置就跟sum一样,所以直接写在单层逻辑里就行
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
int sum = 0;
int start_index = 0;
void traversal(vector<int>& candidates, int target, int sum, int start_index, vector<bool> used) {
if (sum > target) return;
if (sum == target) {
result.push_back(path);
return;
}
for( int i = start_index; i < candidates.size(); i++) {
// 要对同一树层使用过的元素进行跳过
if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
continue;
}
sum += candidates[i];
path.push_back(candidates[i]);
used[i] = true; //这句不会写,就是取了这个数就把他置1
//traversal(candidates, target, sum, start_index + 1, used);这句写错了,因为i一直在变但是start_index这个变量一直是零
traversal(candidates, target, sum, i + 1, used);
used[i] = false;
sum -= candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> used(candidates.size(), 0);
sort(candidates.begin(), candidates.end());
traversal(candidates, target,0,0,used);
return result;
}
};
131.分割回文串
如何利用startindex和i进行切割这个还需要再理解下, 这个自己写不出;
第一大层递归的时候index是0,然后进入递归第二层小递归for循环第一次只切割一个数字出来;然后第二层小递归for第二次就会切出俩数,但是这个不符合就直接去掉了。
第二大层递归的时候index是1,所以第一次切割会直接切割出俩数,然后第二层小递归也是一个一个切割;
第三大层递归index是2,所以第一次切割会切割出仨数
class Solution {
public:
// vector<int> path; 这里搞错了
// vector<vector<int>> result;
vector<string> path;
vector<vector<string>> result;
bool Palindrome(string &s,int start, int end){
while(start< end){
if(s[start]!=s[end])
{return false;}
else{
start++;
end--;
}
}
return true;
}
void backtracking(string &s, int start_index){
if(start_index == s.size()) {
result.push_back(path);
return;
}
for(int i=start_index;i<s.size();i++){
if(Palindrome(s,start_index,i)){
string str=s.substr(start_index, i-start_index+1);
//path.push_back(s[i]); 这行写错了这个题要把这一段的数字都取出来,所以重新定义了一个变量
path.push_back(str);
}else{
continue;
}
backtracking(s,i+1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return result;
}
};