[代码随想录23回溯]回溯的组合问题+分割子串

前言

回溯是什么?

题目链接

39. 组合总和 - 力扣(LeetCode)

40. 组合总和 II - 力扣(LeetCode)

131. 分割回文串 - 力扣(LeetCode)

一、组合问题

cpp 复制代码
    private:
    vector<vector<int>>res;
    vector<int> path;
    void backtracking(vector<int>&candidates,int target,int sum,int startIndex){
        if(sum==target){
            res.push_back(path);
            return ;
        }
        for(int i=startIndex;i<candidates.size()&&sum+candidates[i]<=target;i++){
            sum+=candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates,target,sum,i);
            sum-=candidates[i];
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        res.clear();
        path.clear();
        sort(candidates.begin(),candidates.end());
        backtracking(candidates,target,0,0);
        return res;
    }

二、组合问题

cpp 复制代码
vector<vector<int>>res;
    vector<int>path;
    void backtracking(vector<int>&candidates,int target,int sum,int startIndex){
            if(sum==target) {res.push_back(path);return;}
            for(int i=startIndex;i<candidates.size()&&sum+candidates[i]<=target;i++){
            if(i>startIndex&&candidates[i]==candidates[i-1])continue;
            sum+=candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates,target,sum,i+1);
            sum-=candidates[i];
            path.pop_back();
          }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        backtracking(candidates,target,0,0);
        return res;
    }

三、分割回文串

cpp 复制代码
    vector<vector<string>> res;
    vector<string>path;
    void backtracking(const string&s,int startIndex){
        if(startIndex>=s.size()){
            res.push_back(path);
            return ;
        }
        for(int i=startIndex;i<s.size();i++){
            if(isPalindrome(s,startIndex,i)){
                string str=s.substr(startIndex,i-startIndex+1);
                path.push_back(str);
            }else{
                continue;
            }
            backtracking(s,i+1);
            path.pop_back();
        }
    }
    bool isPalindrome(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;
    }

public:
    vector<vector<string>> partition(string s) {
        backtracking(s,0);
        return res;
    }

总结

相关推荐
先做个垃圾出来………25 分钟前
差分数组(Difference Array)
java·数据结构·算法
hansang_IR1 小时前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积
乐迪信息1 小时前
乐迪信息:AI摄像机在智慧煤矿人员安全与行为识别中的技术应用
大数据·人工智能·算法·安全·视觉检测
多恩Stone1 小时前
【3DV 进阶-2】Hunyuan3D2.1 训练代码详细理解下-数据读取流程
人工智能·python·算法·3d·aigc
惯导马工2 小时前
【论文导读】IDOL: Inertial Deep Orientation-Estimation and Localization
深度学习·算法
老姜洛克2 小时前
自然语言处理(NLP)之n-gram从原理到实战
算法·nlp
CoovallyAIHub3 小时前
基于YOLO集成模型的无人机多光谱风电部件缺陷检测
深度学习·算法·计算机视觉
CoovallyAIHub3 小时前
几十个像素的小目标,为何难倒无人机?LCW-YOLO让无人机小目标检测不再卡顿
深度学习·算法·计算机视觉
怀旧,3 小时前
【C++】19. 封装红⿊树实现set和map
linux·c++·算法
往事随风去3 小时前
Redis的内存淘汰策略(Eviction Policies)有哪些?
redis·后端·算法