代码随想录打卡Day24

今天的题目还好,除了第二道题看了一半视频,其他的自己写就AC了。

93.复原IP地址

这道题目和昨天的分割回文子串很像,不过这道题需要自己定义一个判断子字符串是否合法的函数,如果含有前导0或者超过3位直接pass,如果转化成整型变量,大于255也pass,其余的就是符合要求的,另外,本题还需要定义一个全局变量count,得到一个合法字符串就加到结果中,并且将count加一,只有当遍历到字符串末尾且count刚好为4时才将结果存入。

class Solution {
public:
    vector<string> result;
    string path;
    int count = 0;
    vector<string> restoreIpAddresses(string s) {
        BackTracking(s, 0);
        return result;
    }
    bool is_Valid(string s){  //判断子字符串是否合法
        if(s.size() > 1 && s[0] == '0')  //含有前导0
            return false;
        if(s.size() >= 4)
            return false;
        return stoi(s) <= 255 ? true : false;
    }
    void BackTracking(string s, int Start_Index){
        //确定终止条件
        if(Start_Index >= s.size() && count == 4){
            path.resize(path.size() - 1);
            result.push_back(path);
            return ;
        }
        for(int i = Start_Index; i < s.size(); i++){
            if(!is_Valid(s.substr(Start_Index, i - Start_Index + 1)))  //子字符串非法
                continue;
            int SIZE = path.size();
            count++;
            path += s.substr(Start_Index, i - Start_Index + 1);
            path += '.';
            BackTracking(s, i + 1);
            path.resize(SIZE);
            count--;
        }
    }
};

78.子集

这道题目想了很久,实在想不出来才去看了会视频,卡哥一点就通,很顺利地就AC了。这一题的重点在于在每一个节点都收获结果,而不是在终止条件中收获结果,这一点和之前的回溯题目完全不一样。

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    vector<vector<int>> subsets(vector<int>& nums) {
        BackTracking(nums, 0);
        result.push_back({});
        return result;
    }
    void BackTracking(vector<int> &nums, int Start_Index){
        //确定终止条件
        if(Start_Index >= nums.size()) return ;
        //单层递归逻辑
        for(int i = Start_Index; i < nums.size(); i++){
            path.push_back(nums[i]);
            //在每一层递归都收获结果,而不是在终止条件
            result.push_back(path);
            BackTracking(nums, i + 1);
            path.pop_back();
        }
    }
};

90.子集II

有了上一道题的基础,这道题做起来很快,这道题还和之前的树层去重很像,也是需要用到used数组来记录数字的使用情况,千万别忘了需要先对输入的数组进行升序排列,再送入递归函数中进行遍历。

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    vector<int> used;
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        used.resize(nums.size());
        sort(nums.begin(), nums.end());
        BackTracking(nums, 0);
        result.push_back({});
        return result;
    }
    void BackTracking(vector<int> &nums, int Start_Index){
        //确定终止条件
        if(Start_Index >= nums.size()) return ;
        //确定单层递归逻辑
        for(int i = Start_Index; i < nums.size(); i++){
            if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) //重复情况
                continue;
            used[i] = 1;
            path.push_back(nums[i]);
            result.push_back(path);
            BackTracking(nums, i + 1);
            path.pop_back();
            used[i] = 0;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值