代码随想录算法训练营 | 回溯算法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;
    }
};
相关推荐
双叶8361 小时前
(C语言)虚数运算(结构体教程)(指针解法)(C语言教程)
c语言·开发语言·数据结构·c++·算法·microsoft
工一木子1 小时前
大厂算法面试 7 天冲刺:第5天- 递归与动态规划深度解析 - 高频面试算法 & Java 实战
算法·面试·动态规划
invincible_Tang2 小时前
R格式 (15届B) 高精度
开发语言·算法·r语言
独好紫罗兰3 小时前
洛谷题单2-P5715 【深基3.例8】三位数排序-python-流程图重构
开发语言·python·算法
牵牛老人3 小时前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式
序属秋秋秋4 小时前
算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
c语言·c++·学习·算法
玉树临风ives4 小时前
leetcode 2360 图中最长的环 题解
算法·leetcode·深度优先·图论
KeithTsui4 小时前
GCC RISCV 后端 -- 控制流(Control Flow)的一些理解
linux·c语言·开发语言·c++·算法
mNinGInG5 小时前
c++练习
开发语言·c++·算法
EPSDA5 小时前
Boost库中的谓词函数
c++