- 39. 组合总和
- 40.组合总和II
- 131.分割回文串
39. 组合总和
vector<vector<int>> all;
vector<int> one;
int sum;//和
// 比如电话组合就是需要个当前索引位置拆开来
void backing(vector<int>& candidates, int target,int startindex) {
if (sum == target) {
all.push_back(one);
return;
}
if (sum > target)
return;
for(int i=startindex;i<candidates.size();i++){
if(candidates[i]>target)continue;
one.push_back(candidates[i]);
sum+=candidates[i];
backing(candidates,target,i);
sum-=candidates[i];
one.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backing(candidates,target,0);
return all;
}
40.组合总和II
vector<vector<int>> all;
vector<int> one;
int sum;
void backing(vector<int>& candidates, int target,int startindex,vector<bool>& b1){
if(sum>target)return;
if(sum==target){
all.push_back(one);return;
}
for(int i=startindex;i<candidates.size()&&sum+candidates[i]<=target;i++){
if(i>0&&candidates[i]==candidates[i-1]&&!b1[i-1])continue;
one.push_back(candidates[i]);
sum+=candidates[i];
b1[i]=true;
backing(candidates,target,i+1,b1);
sum-=candidates[i];
b1[i]=false;
one.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> b1(candidates.size(),false);
sort(candidates.begin(),candidates.end());
backing(candidates,target,0,b1);
return all;
}
131.分割回文串
vector<vector<string>> all;
vector<string> one;
bool ishuiwen(string s,int start,int end){
if(s.size()==0)return false;
for(int i=start,j=end;i<=j;j--,i++){
if(s[i]!=s[j])return false;
}
return true;
}
void backing(string s,int startindex)//代表切割的位置,
{
if(startindex==s.size()){
all.push_back(one);
return;
}
for(int i=startindex;i<s.size();i++){
if(ishuiwen(s,startindex,i)){
string s1=s.substr(startindex,i-startindex+1);//
one.push_back(s1);
}else continue;
backing(s,i+1);
one.pop_back();
}
}
vector<vector<string>> partition(string s) {
backing(s,0);
return all;
}