39. 组合总和
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int> candidates, int target, int sum, int startindex) {
if (target == sum) {
result.push_back(path);
return;
}
if (target < sum) return;
for (int i = startindex; i < candidates.size(); ++i) {
path.push_back(candidates[i]);
sum += candidates[i];
backtracking(candidates, target, sum, i);
path.pop_back();
sum -= candidates[i];
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
result.clear();
path.clear();
backtracking(candidates, target, 0, 0);
return result;
}
};
40. 组合总和 II
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int> candidates, int target, int sum, vector<bool> used, int startindex) {
if (target == sum) {
result.push_back(path);
return;
}
if (target < sum) return;
for (int i = startindex; i < candidates.size(); ++i) {
if (i >= 1 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
continue;
}
path.push_back(candidates[i]);
sum += candidates[i];
used[i] = true;
backtracking(candidates, target, sum, used, i + 1);
path.pop_back();
sum -= candidates[i];
used[i] = false;
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
int canlen = candidates.size();
vector<bool> used(canlen, false);
backtracking(candidates, target, 0, used, 0);
return result;
}
};
131. 分割回文串
class Solution {
public:
vector<vector<string>> result;
vector<string> path;
bool isPanlidrome(string str) {
if (str.size() == 0) return false;
int left = 0, right = str.size() - 1;
while (left <= right) {
if (str[left] != str[right]) return false;
left++;
right--;
}
return true;
}
void backtracking(string s, int startindex) {
if (startindex >= s.size()) {
result.push_back(path);
return;
}
for (int i = startindex; i < s.size(); ++i) {
string str = s.substr(startindex, i - startindex + 1);
if (isPanlidrome(str)) {
path.push_back(str);
}
else {
continue;
}
backtracking(s, i + 1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s, 0);
return result;
}
};