代码随想录算法训练营 | 回溯算法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;
    }
};
相关推荐
MC皮蛋侠客3 小时前
Google Test 单元测试指南
c++·单元测试·google test
艾莉丝努力练剑4 小时前
【Linux:文件】Ext系列文件系统进阶
linux·运维·服务器·c++·文件系统·文件io·ext
kkeeper~4 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6665 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964136 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
basketball6166 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
嗝o゚6 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Fre丸子_7 小时前
自定义文件夹选取功能
c++
Ulyanov8 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真