39. 组合总和
class Solution {
public:
vector<vector<int>> res;
vector<int> vec;
int sum;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtracking(candidates,target,0);
return res;
}
void backtracking(vector<int> & nums,int target,int index){
if(sum==target){
res.push_back(vec);
return;
}
if(sum>target){
return;
}
for(int i=index;i<nums.size();i++){
sum+=nums[i];
vec.push_back(nums[i]);
backtracking(nums,target,i);
vec.pop_back();
sum-=nums[i];
}
}
};
40. 组合总和 II
思路:此题跟上一题相比多了排序和去重的过程。我们需要对数组进行排序,这样之后,数组的重复元素则会排列在一起,方便进行去重的过程。
class Solution {
public:
vector<int> vec;
vector<vector<int>> res;
int sum;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
backtracking(candidates,target,0);
return res;
}
void backtracking(vector<int>& nums,int target,int index){
if(sum==target){
res.push_back(vec);
return;
} //达成退出条件,且满足结果,保存结果
if(sum>target){
return;
}
for(int i =index;i<nums.size();i++){
if(i>index&&nums[i-1]==nums[i] ) continue; //去重
vec.push_back(nums[i]);
sum+= nums[i];
backtracking(nums,target,i+1);
sum-=nums[i];
vec.pop_back();
}
}
};
131. 分割回文串、
class Solution {
public:
bool isPalindrome(const string& s, int start, int end) {//双指针判断回文串,一个指针从0往后移动,一个指针从末尾往前移动,如果有不同元素,则不是回文。
for (int i = start, j = end; i < j; i++, j--) {
if (s[i] != s[j]) {
return false;
}
}
return true;
}
vector<vector<string>> res;
vector<string> vec;
void backtracking(string s,int index){
if(index>=s.size()){
res.push_back(vec);
return;
}
for(int i = index;i<s.size();i++){
if(isPalindrome(s,index,i)){ //如果是回文串,就进行截取
string str = s.substr(index,i-index+1);
vec.push_back(str);
}
else continue;
backtracking(s,i+1);
vec.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return res;
}
};