算法打卡 Day29(回溯算法)-复原 IP 地址 + 子集 + 子集 Ⅱ

文章目录

Leetcode 93-复原 IP 地址

题目描述

https://leetcode.cn/problems/restore-ip-addresses/description/

解题思路

这是一道切割问题,可以参考分割回文串的思路

采用 isValid 函数判断当前切割得到的子串是否有效

cpp 复制代码
class Solution {
public:
    vector<string> res;
    bool isValid(string s, int start, int end){
        if(start > end) return false;
        if (s[start] == '0' && end - start > 0) return false;
        if (end - start + 1 > 3) return false; // 添加长度检查
        string sub = s.substr(start, end-start+1);
        int num = stoi(sub);
        if (num > 255) return false;
        return true;
    }
    void backTracking(string s, int startIndex, int dotNum){
        if(dotNum == 3){
            if (isValid(s, startIndex,s.size()-1)){
                res.push_back(s);
            }
            return;
        }
        for (int i = startIndex; i< startIndex+3 && i <s.size();i++){
            if (isValid(s, startIndex,i)){
                s.insert(s.begin()+i+1,'.');
                dotNum += 1;
                backTracking(s, i + 2, dotNum);
                dotNum -= 1;
                s.erase(s.begin()+i+1);
            }
        }
    }
    vector<string> restoreIpAddresses(string s) {
        backTracking(s,0,0);
        return res;
    }
};

Leetcode 78-子集

题目描述

https://leetcode.cn/problems/subsets/description/

解题思路

在子集问题中需要在每一层递归中进行结果的收集

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

Leetcode 90-子集 Ⅱ

题目描述

https://leetcode.cn/problems/subsets-ii/description/

解题思路

cpp 复制代码
class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;
    void backTracking(vector<int>& nums, int startIndex){
        res.push_back(path);
        if (startIndex == nums.size()) return;
        for (int i =startIndex; i < nums.size();i++){
            if (i >startIndex && nums[i]==nums[i-1]) continue;
            path.push_back(nums[i]);
            backTracking(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        backTracking(nums,0);
        return res;
    }
};
相关推荐
tjl521314_216 分钟前
01C++ 分离编译与多文件编程
前端·c++·算法
_日拱一卒7 分钟前
LeetCode:23合并K个升序链表
java·数据结构·算法·leetcode·链表·职场和发展
cany10007 分钟前
C++ -- 泛型编程
java·开发语言·c++
格林威9 分钟前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附C++ 实战演示
开发语言·c++·人工智能·数码相机·计算机视觉·视觉检测·工业相机
哆啦刘小洋9 分钟前
【LeetCode每日一题】:2033(贪心+快速排序魔改)
算法·leetcode
WolfGang00732112 分钟前
代码随想录算法训练营 Day48 | 图论 part06
算法·图论
cheems952717 分钟前
[算法手记] 动态规划 ,二维费用限制背包问题如何处理
算法·动态规划
Chase_______24 分钟前
LeetCode 1343 题解:定长滑动窗口经典入门题,从暴力枚举到高效优化一文搞懂
算法·leetcode·职场和发展
样例过了就是过了24 分钟前
LeetCode热题100 单词拆分
c++·算法·leetcode·动态规划·哈希算法
王老师青少年编程39 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【跳跃与过河问题】:跳跳!
c++·算法·贪心·csp·信奥赛·跳跃与过河问题·跳跳