代码随想录算法训练营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;
    }
};
相关推荐
卷福同学26 分钟前
去掉手机APP开屏广告,李跳跳2.2下载使用
java·后端·算法
漫霂37 分钟前
二叉树的翻转
java·数据结构·算法
语戚37 分钟前
力扣 51. N 皇后:基础回溯、布尔数组优化、位运算全解(Java 实现)
java·算法·leetcode·力扣·剪枝·回溯·位运算
熊猫钓鱼>_>39 分钟前
从零构建大模型可调用的Skill:基于Function Calling的完整指南
人工智能·算法·语言模型·架构·agent·skill·functioncall
py有趣44 分钟前
力扣热门100题之螺旋矩阵
算法·leetcode
xiaoyaohou111 小时前
003、轻量化改进(一):网络剪枝原理与实战
算法·机器学习·剪枝
我是章汕呐1 小时前
政策评估的“黄金标准”:DID模型从原理到Stata实操
大数据·人工智能·经验分享·算法·回归
2301_822703201 小时前
光影进度条:鸿蒙Flutter实现动态光影效果的进度条
算法·flutter·华为·信息可视化·开源·harmonyos
人道领域1 小时前
【LeetCode刷题日记】383 赎金信
算法·leetcode·职场和发展
炽烈小老头1 小时前
【每天学习一点算法 2026/04/11】Pow(x, n)
学习·算法