算法刷题 Day 28 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II

详细布置

93.复原IP地址

本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了

题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html

视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/

Tips:下面是自己写出的题解,虽然和carl的实现方式略有不同,但是思路是差不多的。

我的题解:

class Solution {
public:
    vector<string> result;
    vector<string> path;

    void backtracking(string s, int pos){
        if(pos == s.size() && path.size() == 4){
            string temp = "";
            for(int i = 0; i<path.size(); i++){
                temp += path[i] + ".";
            }
            temp.pop_back();
            result.push_back(temp);
            return;
        }

        for(int i = pos; i<s.size() && (i - pos) <=3 ; i++){
            string front = s.substr(pos, i - pos + 1);
            if(judge(front)){
                path.push_back(front);
                backtracking(s,i+1);
                path.pop_back();
            }
        }
    }

    bool judge(string str){
        if(str.size()>=2&&str[0] == '0'){
            return false;
        }
        int num = 0;
        for(int i=0; i<str.size();i++){
            if(str[i]>'9' || str[i] < '0'){
                return false;
            }
            num = num * 10 + (str[i] - '0');
        }
        if(num >255){
            return false;
        }
        return true;
    }

    vector<string> restoreIpAddresses(string s) {
        backtracking(s,0);
        return result;
    }
};

78.子集

子集问题,就是收集树形结构中,每一个节点的结果。 整体代码其实和 回溯模板都是差不多的。

题目链接/文章讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html

视频讲解:https://www.bilibili.com/video/BV1U84y1q7Ci

Tips:子集其实就是在每次更新path的时候都将结果加入到result当中去即可。

我的题解:

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;

    void backtracking(vector<int>& nums, int pos){
        if(pos >= nums.size()){
            return;
        }

        for(int i = pos; i< nums.size(); i++){
            path.push_back(nums[i]);
            result.push_back(path);
            backtracking(nums, i+1);
            path.pop_back();
        }
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        result.push_back(path);
        backtracking(nums,0);
        return result;
    }
};

90.子集II

大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。

题目链接/文章讲解:https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.html

视频讲解:https://www.bilibili.com/video/BV1vm4y1F71J

Tips:回溯时记得也要更新used数组的状态

我的题解:

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;

    void backtracking(vector<int>& nums, int pos, vector<bool>& used){
        if(pos >= nums.size()){
            return;
        }

        for(int i = pos; i < nums.size(); i++){
            if(i >= 1 && nums[i] == nums[i-1] && used[i-1] == false){
                continue;
            }
            path.push_back(nums[i]);
            result.push_back(path);
            used[i] = true;
            backtracking(nums, i+1, used);
            used[i] = false;
            path.pop_back();
        }
    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        sort(nums.begin(), nums.end());
        result.push_back(path);
        backtracking(nums, 0, used);
        return result;
    }
};
posted @ 2023-01-31 00:11  GavinGYM  阅读(29)  评论(0)    收藏  举报