代码随想录算法训练营 | 回溯算法part03

93.复原IP地址

93.复原IP地址

cpp 复制代码
class Solution {
private:
    vector<string> res;
    string temp;
    void backtracing(string& s, int startIndex, int cnt) {
        if (cnt > 4) {  // 是否是四位整数
            return;
        }
        if (cnt == 4 && startIndex >= s.size()) {
            res.push_back(temp.substr(0, temp.size() - 1)); // 去掉最后一个'.'
            return;
        }
        for (int i = startIndex; i < s.size(); ++i) {
            string str = s.substr(startIndex, i - startIndex + 1); // 切割子串
            if (str.size() >= 4) { // 防止转换为数字的时候溢出
                continue;
            }
            int num = stoi(str);
            if ((str.size() == 1 || (str.size() > 1 && str[0] != '0')) && (num >= 0 && num <= 255)) { // 不含前导零,且范围在[0,255]之间
                temp += str;
                temp.push_back('.');
            } else {
                continue;
            }
            backtracing(s, i + 1, cnt + 1);
            temp.pop_back(); // 回溯 去'.'
            temp = temp.substr(0, temp.size() - str.size()); // 去str
        }
    }
public:
    vector<string> restoreIpAddresses(string s) {
        res.clear();
        temp.clear();
        backtracing(s, 0, 0);
        return res;
    }
};

78.子集

78.子集

收集树中的所有节点

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> temp;
    void backtracing(vector<int>& nums, int startIndex) {
        res.push_back(temp);
        for (int i = startIndex; i < nums.size(); ++i) {
            temp.push_back(nums[i]);
            backtracing(nums, i + 1);
            temp.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        backtracing(nums, 0);
        return res;
    }
};

90.子集II

90.子集II

cpp 复制代码
class Solution {
private:
    vector<vector<int>> res;
    vector<int> temp;
    void backtracing(vector<int>& nums, vector<bool>& used, int startIndex) {
        res.push_back(temp);
        for (int i = startIndex; i < nums.size(); ++i) {
            if (i > 0 && used[i - 1] == false && nums[i] == nums[i - 1]) {
                continue;
            }
            used[i] = true;
            temp.push_back(nums[i]);
            backtracing(nums, used, i + 1);
            used[i] = false;
            temp.pop_back();
        }
    }

public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<bool> used(nums.size(), false);
        backtracing(nums, used, 0);
        return res;
    }
};
相关推荐
Paddi93033 分钟前
Codeforces Round 1004 (Div. 1) C. Bitwise Slides
c++·算法
Luis Li 的猫猫1 小时前
深度学习中的知识蒸馏
人工智能·经验分享·深度学习·学习·算法
查理零世2 小时前
【蓝桥杯集训·每日一题2025】 AcWing 6118. 蛋糕游戏 python
python·算法·蓝桥杯
敲代码的小王!2 小时前
MD5加密算法和BCrypt密码加密算法
java·算法·安全
带娃的IT创业者3 小时前
机器学习实战(6):支持向量机(SVM)——强大的非线性分类器
算法·机器学习·支持向量机
流星白龙5 小时前
【C++】36.C++IO流
开发语言·c++
孑么5 小时前
力扣 买卖股票的最佳时机
算法·leetcode·职场和发展·贪心算法·动态规划
诚信爱国敬业友善6 小时前
常见排序方法的总结归类
开发语言·python·算法
靡不有初1116 小时前
CCF-CSP第31次认证第二题——坐标变换(其二)【NA!前缀和思想的细节,输出为0的常见原因】
c++·学习·ccfcsp
gentle_ice7 小时前
跳跃游戏 II - 贪心算法解法
数据结构·算法·leetcode·贪心算法