[代码随想录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;
    }

总结

相关推荐
戊辰happy36 分钟前
arcface
算法
浊酒南街2 小时前
决策树python实现代码1
python·算法·决策树
冠位观测者3 小时前
【Leetcode 热题 100】208. 实现 Trie (前缀树)
数据结构·算法·leetcode
小王爱吃月亮糖4 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
IT猿手6 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解LRMOP1-LRMOP6及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·matlab·智能优化算法·多目标算法
InfiSight智睿视界7 小时前
AI 技术,让洗护行业焕然「衣」新
人工智能·算法
程序员一诺7 小时前
【机器学习】嘿马机器学习(算法篇)第11篇:决策树算法,学习目标【附代码文档】
人工智能·python·算法·机器学习
Evand J7 小时前
平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题
算法
taoyong0017 小时前
代码随想录算法训练营第十五天-二叉树-110.平衡二叉树
数据结构·算法
-芒果酱-7 小时前
k-Means聚类算法 HNUST【数据分析技术】(2025)
算法·kmeans·聚类