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

总结

相关推荐
liminla!11 分钟前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
维克兜率天1 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
罗西的思考2 小时前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
神也畏惧菠萝2 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..2 小时前
【C语言】分支和循环
c语言·c++·算法
Fuyo_11194 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan4 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..5 小时前
【C语言】猜数字游戏
c语言·算法·游戏
LabVIEW开发5 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序