代码随想录算法训练营 | 回溯算法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;
    }
};
相关推荐
爱吃生蚝的于勒4 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~8 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^33 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城36 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz1 小时前
STL--哈希
c++·算法·哈希算法
CSUC1 小时前
【C++】父类参数有默认值时子类构造函数列表中可以省略该参数
c++
Vanranrr1 小时前
C++ QT
java·c++·qt
kingmax542120081 小时前
初三数学,最优解问题
算法
鸿儒5171 小时前
C++ lambda 匿名函数
开发语言·c++