39. 组合总和
class Solution {
private:
vector<vector<int>> result;
vector<int> set;
int sum = 0;
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
set.clear();
result.clear();
backtrack(candidates, target, 0);
return result;
}
void backtrack(const vector<int>& candidates, const int &target, int index){
if(sum >= target){
if(sum == target){
result.push_back(set);
}
return;
}
for(int i = index; i < candidates.size(); i++){
set.push_back(candidates[i]);
sum += candidates[i];
backtrack(candidates, target, i);
sum -= candidates[i];
set.pop_back();
}
}
};
40.组合总和II
题目链接/文章讲解:代码随想录
视频讲解:回溯算法中的去重,树层去重树枝去重,你弄清楚了没?| LeetCode:40.组合总和II_哔哩哔哩_bilibili
class Solution {
private:
vector<vector<int>> result;
vector<int> set;
int sum = 0;
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0);
return result;
}
void backtracking(const vector<int>& candidates, const int target, int index){
if(sum >= target){
if(sum == target){
result.push_back(set);
}
return;
}
for(int i = index; i < candidates.size() && sum + candidates[i] <= target;){
set.push_back(candidates[i]);
sum += candidates[i];
backtracking(candidates, target, i + 1);
set.pop_back();
sum -= candidates[i];
while(true){
if(i == candidates.size() - 1) break;
if(candidates[i] == candidates[i + 1]){
i++;
}
else{
break;
}
}
i++;
}
}
};
131.分割回文串
class Solution {
private:
vector<vector<string>> result;
vector<string> set;
public:
vector<vector<string>> partition(string s) {
backtracking(s, 0);
return result;
}
void backtracking(const string &s, int index){
if(index >= s.length()){
result.push_back(set);
return;
}
for(int i = index; i < s.length(); i++){
string str = s.substr(index, i - index + 1);
if(isPalindrome(str)){
set.push_back(str);
backtracking(s, i + 1);
set.pop_back();
}
}
}
bool isPalindrome(const string &str){
if(str.length() == 1) return true;
int left = 0;
int right = str.length() - 1;
while(left < right){
if(str[left] == str[right]){
left++;
right--;
}
else{
return false;
}
}
return true;
}
};