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

总结

相关推荐
To_OC6 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安11 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者13 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy19 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC2 天前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法
饼干哥哥2 天前
Reddit VOC调研太慢?搭一个AI专家团队半小时洞察任何品类|以猫用饮水机为例
人工智能·算法·ai编程