Day28|Leetcode 93. 复原 IP 地址 Leetcode 78. 子集 Leetcode 90. 子集 II

Leetcode 93. 复原 IP 地址

题目链接 93 复原 IP 地址

本题目也是分割的典型题目,属于分割回文子串的升级版,大概的思路都是一样的,注意几点,第一个是对ip地址正确与否的条件,第二个插入逗点后,下一个子串的起始位置为i+2,第三就是对于分割区间开闭的不变性和区间范围的取值([startIndex,i]),最后就是这里不仅要对单个区间段进行ip地址的判断,当pointNum==3时要对第四段ip地址进行判断,下面上代码:

class Solution {
    private:
    vector result;
    void backtracking(string&s,int startIndex,int pointNum){
        if(pointNum == 3){
            if(isValid(s,startIndex,s.size()-1)){//第四段判断,左闭右闭
                result.push_back(s);
            }
            return ;
        }
        for(int i=startIndex;iend){//区间不存在
            return false;
        }
        if(s[start] == '0'&&start!=end){//头数字不能为0
            return false;
        }
        int num = 0;
        for(int i=start;i<=end;i++){
            if(s[i]>'9'||s[i]<'0'){//不能有符号
                return false;
            }
            num = num*10+(s[i]-'0');//不能大于255
            if(num>255){
                return false;
            }
        }
       return true;
    }
public:
    vector restoreIpAddresses(string s) {
        if(s.size()<4||s.size()>12){//小小剪枝一下啊
            return result;
        }
        backtracking(s,0,0);
        return result;
    }
};

Leetcode 78. 子集

题目链接 78 子集

本题目和组合几乎是一样的,只有一点不同就是组合取得是叶子节点,而子集是取的全部节点,剩下的都一样,下面上代码:

class Solution {
    private:
    vector path;
    vector> result;
    void backtracking (vector &nums,int startIndex){
        result.push_back(path);//和组合唯一的区别,就是把全部的节点都收集
        if(startIndex >= nums.size()){
            return ;
        }
        for(int i=startIndex;i> subsets(vector& nums) {
        backtracking(nums,0);
        return result;
    }
};

Leetcode 90. 子集 II

题目链接 90 子集 II

本题目就是子集1加上组合总和2的去重问题,不多说直接上代码:

class Solution {
    private:
    vector path;
    vector> result;
    vector used;
    void backtracking (vector &nums,int startIndex,vector & used){
        result.push_back(path);
        if(startIndex>=nums.size()){
            return ;
        }
        for(int i=startIndex;i0&&nums[i]==nums[i-1]&&used[i-1]==false){
                continue;
            }
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums,i+1,used);
            used[i] = false;
            path.pop_back();
        }
    }
    public:
    vector> subsetsWithDup(vector& nums) {
        vector used(nums.size(), false);//初始化
        sort(nums.begin(),nums.end());
        backtracking(nums,0,used);
        return result;
    }
};

要学习六级了,好痛苦 end

你可能感兴趣的:(leetcode,算法,网络,数据结构,职场和发展,tcp/ip,c++)