LeetCode39.组合总和
class Solution {
public:
vector<int> temp;
vector<vector<int>> result;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
dfs(candidates, 0, 0, target);
return result;
}
void dfs(vector<int>& candidates,int curindex, int nowNum, int target){
if(nowNum == target){
result.push_back(temp);
return;
}else if(nowNum > target){
return;
}else{
for(int i = curindex; i < candidates.size(); i++){
nowNum += candidates[i];
temp.push_back(candidates[i]);
dfs(candidates, i, nowNum, target);
nowNum -= candidates[i];
temp.pop_back();
}
}
}
};
LeetCode40.组合总和Ⅱ
class Solution {
public:
vector<int> path;
vector<vector<int>> result;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> used(candidates.size(), false);
std::sort(candidates.begin(),candidates.end());
dfs(candidates, 0, 0, target, used);
return result;
}
void dfs(vector<int>& candidates, int index,int sum, int target, vector<bool> used)
{
if(sum > target){
return;
}
if(sum == target){
result.push_back(path);
return;
}
for(int i = 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;
dfs(candidates, i + 1, sum, target, used);
used[i] = false;
sum -= candidates[i];
path.pop_back();
}
}
};
LeetCode131.分割回文串
class Solution {
public:
vector<string> path;
vector<vector<string>> result;
vector<vector<string>> partition(string s) {
dfs(s);
return result;
}
bool judge(std::string str){
if(str == "")return false;
int i = 0, j = static_cast<int>(str.length()) - 1;
while(j > i){
if(str[j] != str[i])return false;
j--;
i++;
}
return true;
}
void dfs(string s){
if(judge(s)){
path.push_back(s);
result.push_back(path);
path.pop_back();
}
for(int i = 0; i < s.length(); i++){
string sub_str1, sub_str2;
sub_str1 = s.substr(0, i + 1);
sub_str2 = s.substr(i + 1, s.length() - i - 1);
if(judge(sub_str1)){
path.push_back(sub_str1);
dfs(sub_str2);
path.pop_back();
}
}
}
};