代码随想录算法训练营DAY24第七章 回溯算法part03

目录

[93. 复原 IP 地址](#93. 复原 IP 地址)

[78. 子集](#78. 子集)

[90. 子集 II](#90. 子集 II)


93. 复原 IP 地址

cpp 复制代码
class Solution {
    vector<string>ans;
    string path;
    void dfs(string s,int start,int seg){
        if(seg==4){
            if(start==s.size()){
                ans.push_back(path.substr(0,path.size()-1));
            }
            return ;
        }
        int need=4-seg;
        int last=s.size()-start;
        if(last<need||need*3<last)return ;
        int val=0;
        for(int len=1;len<=3;len++){
            if(start+len>s.size())break;
            if(len>1&&s[start]=='0')break;
            if(len==1)val+=s[start]-'0';
            else val=val*10+(s[start+len-1]-'0');
            if(val>255)break;
            int old=path.size();
            path+=s.substr(start,len);
            path+='.';
            dfs(s,start+len,seg+1);
            path.resize(old);
        }
    }
public:
    vector<string> restoreIpAddresses(string s) {
        dfs(s,0,0);
        return ans;
    }
};

78. 子集

法一:

cpp 复制代码
class Solution {
    vector<vector<int>> ans;
    vector<int> path;
    void dfs(vector<int>& nums, int start) {
        ans.push_back(path);
        for (int i = start; i < nums.size(); i++) {
            path.push_back(nums[i]);
            dfs(nums, i + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums, 0);
        return ans;
    }
};

法二:

cpp 复制代码
class Solution {
    void dfs(int x, vector<vector<int>>& ans, vector<int>& path,
             vector<int>& nums) {
        if (x == nums.size()) {
            ans.push_back(path);
            return;
        }
        //选
        path.push_back(nums[x]);
        dfs(x + 1, ans, path, nums);
        //不选
        path.pop_back();
        dfs(x + 1, ans, path, nums);
    }

public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> path;
        dfs(0, ans, path, nums);
        return ans;
    }
};

90. 子集 II

cpp 复制代码
class Solution {
    vector<vector<int>>ans;
    vector<int>path;
    void dfs(vector<int>& nums,int start){
        ans.push_back(path);
        for(int i=start;i<nums.size();i++){
            if(i>start&&nums[i]==nums[i-1])continue;
            path.push_back(nums[i]);
            dfs(nums,i+1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        dfs(nums,0);
        return ans;
    }
};
相关推荐
05Kevin1 小时前
lk每日冒险题--数据结构6.27
算法
To_OC12 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安17 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者19 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy1 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC2 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635072 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法