39.组合总和
关键点:
-
允许重复数字
-
这样的话不能每次都从nums的第一个数字开始遍历,可以允许重复,但是每次都要从当前的这个元素遍历
-
只允许重复读取当前的元素
-
class Solution { public: void backtracking(const vector<int> &nums, vector<int> &path, int startindex, int &count, vector<vector<int>> &res) { if (count < 0) return; if (count == 0) { res.push_back(path); return; } for (int i = startindex; i < nums.size(); ++i) { path.push_back(nums[i]); count -= nums[i]; backtracking(nums, path, i, count, res); count += nums[i]; path.pop_back(); } } vector<vector<int>> combinationSum(vector<int> &candidates, int target) { vector<int> path; vector<vector<int>> res; backtracking(candidates, path, 0, target, res); return res; } };
40.组合总和Ⅱ
- 要保证用的数字后续不再使用:
1.需要对数组进行排序,如果相同数组挨着,那么就要一直跳到下一种数字
2.需要首先对数组进行排序
class Solution {
public:
void backtracking(const vector<int> &nums, vector<int> &path, int startindex, int &count, vector<vector<int>> &res) {
if (count < 0)
return;
if (count == 0) {
res.push_back(path);
return;
}
for (int i = startindex; i < nums.size(); ++i) {
if (i > startindex && nums[i] == nums[i - 1]) {
continue;
}
path.push_back(nums[i]);
count -= nums[i];
backtracking(nums, path, i + 1, count, res);
count += nums[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int> &candidates, int target) {
vector<int> path;
vector<vector<int>> res;
sort(candidates.begin(), candidates.end());
backtracking(candidates, path, 0, target, res);
return res;
}
};
131.分割回文串
- 搞清楚树形结构很关键
- 分清楚每次for中的startindex,i之间的区别
class Solution {
public:
bool check(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;
}
void backtracking(const string &s,
int startindex,
vector<string> &part,
vector<vector<string>> &res) {
if (startindex >= s.size()) {
res.push_back(part);
return;
}
for (int i = startindex; i < s.size(); ++i) {
if (check(s, startindex, i)) {
part.push_back(s.substr(startindex, i - startindex + 1));
} else {
continue;
}
backtracking(s, i + 1, part, res);
part.pop_back();
}
}
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> part;
backtracking(s, 0, part, res);
return res;
}
};
day27结束