这个题与昨天第一题的区别就只有下面这一句(从i+1改成了i),下面这一句就确保了一个数字可以重复使用,但是又不会出现重复的结果,这个要根据树形图理解下
另外这个题减枝的方法是先排序然后再剪纸;这样的话如果上一层递归的sum已经大于或者等于target,就直接跳出这个循环;
下面这句话是终止本层遍历
这个题也是要排序后再做;在回溯的过程中used数组会被重置就跟sum一样,所以直接写在单层逻辑里就行
- class Solution {
- public:
- 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
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;
- }
- };
如何利用startindex和i进行切割这个还需要再理解下, 这个自己写不出;
第一大层递归的时候index是0,然后进入递归第二层小递归for循环第一次只切割一个数字出来;然后第二层小递归for第二次就会切出俩数,但是这个不符合就直接去掉了。
第二大层递归的时候index是1,所以第一次切割会直接切割出俩数,然后第二层小递归也是一个一个切割;
第三大层递归index是2,所以第一次切割会切割出仨数
- class Solution {
- public:
- // vector
path; 这里搞错了 - // vector
> result; - vector
path; - vector
> 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
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
> partition(string s) { -
- backtracking(s,0);
- return result;
- }
- };