代码随想录算法训练营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;
    }
};
相关推荐
兔子77311 分钟前
RNN 终于讲明白了:从“模型为什么需要记忆”到 Elman 1990 全文吃透
算法
兔子77312 分钟前
LSTM 终于讲明白了:从“RNN 为什么会忘”到 Hochreiter & Schmidhuber 1997 全文吃透
算法
ECT-OS-JiuHuaShan17 分钟前
朱梁万有递归元定理,重构《阴符经》
算法·重构
_日拱一卒26 分钟前
LeetCode:最长连续序列
算法·leetcode·职场和发展
2401_8795034129 分钟前
C++与FPGA协同设计
开发语言·c++·算法
重生之后端学习40 分钟前
287. 寻找重复数
数据结构·算法·leetcode·深度优先·图论
抓个马尾女孩44 分钟前
位置编码:绝对位置编码、相对位置编码、旋转位置编码
人工智能·深度学习·算法·transformer
今儿敲了吗1 小时前
46| FBI树
数据结构·c++·笔记·学习·算法
小辉同志1 小时前
139. 单词拆分
算法·动态规划
oem1101 小时前
C++中的访问者模式变体
开发语言·c++·算法