文章目录
- 1. 组合总和 (结果集中可以有重复的元素)
- 2.组合总和|| (去重)
- 3.分割回文串 (第一次没懂)
1. 组合总和 (结果集中可以有重复的元素)
- LeetCode链接
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int startIndex){
if(target == 0){
result.push_back(path);
return ;
}else if(target < 0){
return ;
}
for(int i=startIndex; i<candidates.size(); i++){
path.push_back(candidates[i]);
backtracking(candidates, target-candidates[i], i);
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
result.clear();
path.clear();
backtracking(candidates, target, 0);
return result;
}
};
2.组合总和|| (去重)
- LeetCode链接
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int startIndex, vector<bool> used){
if(target < 0) return ;
else if(target == 0){
result.push_back(path);
return;
}
for(int i=startIndex; i<candidates.size() && target-candidates[i] >= 0; i++){
if(i > 0 && candidates[i] == candidates[i-1] && used[i-1]==false){
continue;
}
path.push_back(candidates[i]);
used[i] = true;
backtracking(candidates, target-candidates[i], i+1, used);
used[i] = false;
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
result.clear();
path.clear();
vector<bool> used(candidates.size(), false);
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, used);
return result;
}
};
3.分割回文串 (第一次没懂)
- LeetCode链接
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
class Solution {
public:
vector<vector<string>> result;
vector<string> path;
bool judgePart(const string& s, int start, int end){
for(int i=start, j=end; i<j; i++, j--){
if(s[i] != s[j]){
return false;
}
}
return true;
}
// 1. 确定参数和返回值
void backtracking(string& s, int startIndex){
// 2. 确定递归终止条件
if(startIndex >= s.size()){
result.push_back(path);
return;
}
// 3. 单层逻辑
for(int i=startIndex; i<s.size(); i++){
if(judgePart(s, startIndex, i)){
string str = s.substr(startIndex, i-startIndex+1);
path.push_back(str);
}else{
continue;
}
backtracking(s, i+1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
result.clear();
path.clear();
backtracking(s, 0);
return result;
}
};