代码随想录算法训练营第二十九天
39. 组合总和
题目链接:39. 组合总和
class Solution {
public:
vector<vector<int>> results;
vector<int> result;
void backtracking(vector<int>& candidates,int target,int sum,int startIndex){
if(sum==target){//终止条件
results.push_back(result);
return;
}
else if(sum>target)return;
for(int i = startIndex;i<candidates.size();i++){
result.push_back(candidates[i]);
sum+=candidates[i];
backtracking(candidates, target, sum,i);//纵向还是从第一个元素开始收集,递归
sum-=candidates[i];//回溯
result.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
int sum = 0;
backtracking(candidates,target,sum,0);
return results;
}
};
40.组合总和II
题目链接:40.组合总和II
class Solution {
public:
vector<int> result;
vector<vector<int>> results;
void backtracking(vector<int>& candidates, int target,int sum ,int startIndex){
if(sum>target)return;
if(sum==target){
results.push_back(result);
return;
}
for(int i = startIndex;i<candidates.size();i++){
if (i > startIndex && candidates[i] == candidates[i - 1]) {//横向去重,需要传入数组是有序的
continue;
}
sum+=candidates[i];
result.push_back(candidates[i]);
backtracking(candidates,target, sum, i+1);
sum-=candidates[i];
result.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
if(candidates.empty())return results;
sort(candidates.begin(), candidates.end());//先排序再传入函数,以便可以去重。
backtracking(candidates, target, 0, 0);
return results;
}
};
131.分割回文串
题目链接:131.分割回文串
class Solution {
public:
bool isPalindrome(int start,int end,string &str_){//判断是否是回文串
if(str_.size()==1)return true;
while(start<end){
if(str_[start]!=str_[end])return false;
start++;
end--;
}
return true;
}
vector<string> result;
vector<vector<string>> results;
void backtracking(int startIndex,string s){
if(startIndex==s.size()){
results.push_back(result);//搜索整个字符串,搜索到末尾就停止
return;
}
for(int i =startIndex;i<s.size();i++){
if(isPalindrome(startIndex,i,s)){//判断是回文就取这个区间内的子串,不是就不取
string st ;
for(int j =startIndex;j<=i;j++){//取子串
st.push_back(s[j]);
}
result.push_back(st);
}else continue;;
backtracking(i+1, s);//递归
result.pop_back();//回溯
}
}
vector<vector<string>> partition(string s) {
backtracking(0, s);
return results;
}
};