代码随想录算法训练营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;
    }
};
相关推荐
海绵宝宝转agent12 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
青少儿编程课堂21 分钟前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
SZYSK1 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
Ivanqhz1 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
lpfasd1232 小时前
推荐算法进化史
算法·机器学习·推荐算法
Pniubi2 小时前
力扣543二叉树的直径(深度优先搜索法(递归))
算法·leetcode·职场和发展
UIU11413 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场13 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi13 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David14 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法