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

总结

相关推荐
T1an-11 小时前
力扣70.爬楼梯
算法·leetcode·职场和发展
T1an-11 小时前
力扣169.多数元素
数据结构·算法·leetcode
_dindong6 小时前
动规:回文串问题
笔记·学习·算法·leetcode·动态规划·力扣
wangwangmoon_light7 小时前
0.0 编码基础模板
java·数据结构·算法
共享家95277 小时前
Leetcode刷题
算法·leetcode·职场和发展
simon_skywalker7 小时前
第7章 n步时序差分 n步时序差分预测
人工智能·算法·强化学习
山,离天三尺三7 小时前
基于LINUX平台使用C语言实现MQTT协议连接华为云平台(IOT)(网络编程)
linux·c语言·开发语言·网络·物联网·算法·华为云
flashlight_hi8 小时前
LeetCode 分类刷题:74. 搜索二维矩阵
python·算法·leetcode·矩阵
小年糕是糕手8 小时前
【数据结构】算法复杂度
c语言·开发语言·数据结构·学习·算法·leetcode·排序算法
程序员-King.8 小时前
day86——有效的字母异位词(LeetCode-242)
算法·字符串