立志重刷代码随想录60天冲冲冲!!——第二十四天

93.复原IP地址

class Solution {
public:
    vector<string> res;
    // pointNum 记录“.”的数量,有三个就结束
    void backtracking(string& s, int startIdx, int pointNum) {
        if (pointNum == 3){
            if (isValid(s, startIdx, s.size() - 1)) {
                res.push_back(s);
                return;
            }
            return;
        }

        for (int i = startIdx; i < s.size(); i++) {
            if (isValid(s, startIdx, i) == true) {
                s.insert(s.begin() + i + 1, '.');
                pointNum++;
                backtracking(s, i + 2, pointNum); // 因为有加入“.”!! 需要+2!!
                pointNum--;
                s.erase(s.begin() + i + 1);
                continue;
            }
            break;
        }
        return;
    }

    bool isValid(string& s, int start, int end) {
        int num = 0;
        if (start > end) return false; // start必须小于end!!必须加!!
        for (int i = start; i <= end; i++) {
            // 1、如果是非数字,不合法
            if (s[i] >= '0' || s[i] <= '9') {
                num = num * 10 + (s[i] - '0');
                if (num > 255) return false; // 2、大于255 不合法
            } else return false;
        }
        // 3、开头是0,且超过两位数,不合法
        if (s[start] == '0' && end - start > 0) return false;
        return true;
    }

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

78.子集

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int>& nums, int startIdx) {
        res.push_back(path); // 需要放在最前面。包括空集
        if (nums.size() == startIdx) {
            return;
        }

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

    vector<vector<int>> subsets(vector<int>& nums) {
        backtracking(nums, 0);
        return res;
    }
};

90.子集II

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

    void backtracking(vector<int>& nums, int startIdx, vector<bool>& used) {
        res.push_back(path);

        for (int i = startIdx; i < nums.size(); i++) {
            // true:在同一树枝中,有重复。允许重复使用。
            // false: 在同一层中,有重复。不允许重复使用。
            if (i > 0 && 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();
        }
        return;
    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        // 需要先排序!!
        sort(nums.begin(), nums.end());
        vector<bool> used(nums.size(), false);
        backtracking(nums, 0, used);
        return res;
    }
};

代码随想录更新 文章被收录于专栏

冲冲冲冲冲冲!

全部评论

相关推荐

11-12 12:49
门头沟学院 Java
华子offer审批是申请部门的offer吗,有牛油懂的吗
沟槽的公式:m,同样是说审批,一周两周内出结果,不知道稳不稳
点赞 评论 收藏
分享
10-16 19:36
已编辑
金华职业技术学院 Java
程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务