首页 > 编程语言 >【算法训练营day28】LeetCode93. 复原IP地址 LeetCode78. 子集 LeetCode90. 子集II

【算法训练营day28】LeetCode93. 复原IP地址 LeetCode78. 子集 LeetCode90. 子集II

时间:2023-01-28 19:33:34浏览次数:63  
标签:index day28 nums LeetCode90 start vector 子集 result backtracking

LeetCode93. 复原IP地址

题目链接:93. 复原IP地址

独上高楼,望尽天涯

想起来简单,写起来还是很难的一道题, 小错误频发。

慕然回首,灯火阑珊

首先,因为本题要求只能分割成四段,所以不能用start_index来判断是否终止,而是使用point_num是否等于3来判断,point_num等于3即已经分割出三段了,这时候只需要判断剩下的第四段是否合法即可。

其次,和之前的题目不同, 本题不需要单独维护一个path来保存临时结果,只需要在原s上加点即可。

最后,最好使用stol代替stoi防止整型溢出,同时需要提前判断输入的两个参数是否合法,即第一个参数必须小于等于第二个参数。

class Solution {
private:
    vector<string> result;
    bool isIP(const string& s, int start, int end) {
        if (start > end) {
            return false;
        }
        else if(end - start > 0 && s[start] == '0') {
            return false;
        }
        else if (stol(s.substr(start, end - start + 1)) > 255) { // stol防止整型溢出
            return false;
        }
        return true;
    }
    void backtracking(string s, int start_index, int point_num) {
        if (point_num == 3) { // 注意使用的是point_num判断终止
            if (isIP(s, start_index, s.size() - 1)) {
                result.push_back(s);
            }
            return;
        }
        for (int i = start_index; i < s.size(); i++) {
            if (isIP(s, start_index, i)) {
                s.insert(i + 1, "."); // 直接修改s即可
                point_num++;
                backtracking(s, i + 2, point_num);
                s.erase(i + 1, 1);
                point_num--;
            }
            else {
                break;
            }
        }
    }
public:
    vector<string> restoreIpAddresses(string s) {
        backtracking(s, 0, 0);
        return result;
    }
};

LeetCode78. 子集

题目链接:78. 子集

独上高楼,望尽天涯

比较简单的一道题,和组合问题很像,区别在于组合问题收集的是叶子节点的结果,本题是收集所有节点的结果。

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums, int start_index) {
        result.push_back(path); // 收集所有节点的结果
        for (int i = start_index; i < nums.size(); i++) {
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        backtracking(nums, 0);
        return result;
    }
};

慕然回首,灯火阑珊

想的一样。


LeetCode90. 子集II

题目链接:90. 子集II

独上高楼,望尽天涯

和前面的一道题非常像,这次写在i < start_index上卡壳了,还需要时间消化。

慕然回首,灯火阑珊

理解“树层去重”和“树枝去重”非常重要

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums, int start_index) {
        result.push_back(path);
        for (int i = start_index; i < nums.size(); i++) {
            if (i > start_index && nums[i] == nums[i-1]){ // 注意这里,i > start_index非常重要
                continue;
            }
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        backtracking(nums, 0);
        return result;
    }
};

标签:index,day28,nums,LeetCode90,start,vector,子集,result,backtracking
From: https://www.cnblogs.com/BarcelonaTong/p/17071145.html

相关文章

  • 【理论】子集卷积方法
    子集卷积问题即对于每一个二进制集合\(S(|S|\leqn)\),求出:\[C_S=\sum_{T\inS}A_TB_{S\operatorname{xor}T}\]不难发现其等价于:\[C_S=\sum_{T1|T2=S,|T1|+|T2|=|S|}A_{......
  • 【补档 12th Jan】子集2
    【补档12thJan】子集2给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返回的解集中,子集可以按任意顺序......
  • [补档 12th Jan] 子集
    [补档12thJan]78子集给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。输......
  • 代码随想录算法训练营第二十八天 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II
    ●93.复原IP地址●78.子集●90.子集II详细布置93.复原IP地址本期本来是很有难度的,不过大家做完分割回文串之后,本题就容易很多了题目链接/文章讲解:https......
  • Trick 8:子集卷只因的 SOSDP 做法
    问题引入:对于两个数组\(a\),\(b\),长度为\(2^n\),从\(0\)开始标号。求\(c_i=\sum\limits_{p\&q=i}a_pb_q\)。关于这个问题的求解,我们可以使用SOSDP完成一系列......
  • 90. 子集 II
    90.子集II难度中等997收藏分享切换为英文接收动态反馈给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返......
  • 78. 子集
    78.子集难度中等1890收藏分享切换为英文接收动态反馈给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可......
  • 【LeeCode】416. 分割等和子集 -- todo
    【题目描述】给你一个 只包含正整数 的 非空 数组 ​​nums​​ 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。​​​​https://leetcode.c......
  • 698. 划分为k个相等的子集
    题目描述给出一个数组nums,问能不能分为k份,每份的和都相等,数组的长度不超过16f1-状态压缩+记忆化搜索基本分析数组长度不超过16?暗示可以对选择情况用二进制进行表达df......
  • 科研-彩虹子集
    彩虹子集Patialtransversal问题描述:给定图类\(\mathcal{G}\),图性质\(\mathbb{P}\)和正整数\(s,t\),确定一个最小的整数\(N\),使得对于图类\(\mathcal{G}\)中的任......