马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- class Solution {
- public:
- vector<vector<int>> res;
- vector<int> path;
- int sum=0;
- void backtracking(vector<int>& candidates, int target,int startIndex){
- if(sum>target)
- return;
- if(sum==target){
- res.push_back(path);
- return;
- }
- for(int i=startIndex;i<candidates.size();i++){
- sum+=candidates[i];
- path.push_back(candidates[i]);
- backtracking(candidates,target,i);
- sum-=candidates[i];
- path.pop_back();
- }
- }
- vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
- backtracking(candidates,target,0);
- return res;
- }
- };
复制代码 首先我们要明确集合的概念 不论顺序 只要元素不一样就是组合 所以我们从小向大下标遍历 避免出现重复组合 这时候因为元素可以无限利用 每次下标不消加一
- class Solution {
- public:
- int sum=0;
- vector<vector<int>> res;
- vector<int> path;
- void backtracking(vector<int>& candidates, int target,int startIndex,vector<bool>& used){
- if(sum>target)
- return;
- if(sum==target){
- res.push_back(path);
- return;
- }
- for(int i=startIndex;i<candidates.size();i++){
- //如何判断当前结点相同数值之前是否已经被遍历过
- if(i>0&&candidates[i]==candidates[i-1]&&used[i-1]==false)
- continue;
- used[i]=true;
- sum+=candidates[i];
- path.push_back(candidates[i]);
- backtracking(candidates,target,i+1,used);
- used[i]=false;
- sum-=candidates[i];
- path.pop_back();
- }
- }
- vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
- vector<bool> used(candidates.size(),false);
- sort(candidates.begin(),candidates.end());//排序使得相同元素相邻 方便剪枝
- backtracking(candidates,target,0,used);
- return res;
- }
- };
复制代码 上一题:
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中全部可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
这一题:
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中全部可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能利用 一次 。
我们可以看出和前一题不同在于candidates元素可能重复 candidate的元素在每个组合只能利用一次
如果没有重复元素 只要startIndex(i)+1就可以, 但如果有重复元素就阐明即使每次startIndex(i)+1 反面的重复元素 比如两个 1 1 2 3 要天生 6 可能会天生两个 123 123 如何避免这种情况就是要在重复元素出现的时候避免重复遍历 反面的1可以看作前面的1的真子集 全部情况都是包罗的
所以只要遍历第一个重复元素就行 ,所以每次看前一个元素是否相称而且有没有被遍历到
利用bool数组 留意一条路径可以前后元素可以相同 同一层不能相同 所以true代表递归 false代表回溯 得证
- class Solution {
- public:
- vector<vector<string>> res;
- vector<string> path;
- bool ishuiwen(string s){
- int i=0,j=s.size()-1;
- while(i<j){
- if(s[i]!=s[j])
- return false;
- i++;
- j--;
- }
- return true;
- }
- void backtracking(string s,int startIndex){
- if(startIndex>=s.size()){
- res.push_back(path);
- return;
- }
- for(int i=startIndex;i<s.size();i++){
- //从startINdex分隔
- string str=s.substr(startIndex,i-startIndex+1);
- if(ishuiwen(str)){
- path.push_back(str);
- }else{
- continue;
- }
- backtracking(s,i+1);
- path.pop_back();
- }
- }
- vector<vector<string>> partition(string s) {
- backtracking(s,0);
- return res;
- }
- };
复制代码 分隔回文串
首先遍历切割位置 利用substr切割字符串
递归直到start超范围阐明乐成找到一组 留意 不要先都递归在判断 判断过程相当于剪枝直接镌汰重复情况。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |