代码随想录算法训练营第二十二天| 回溯 93.复原IP地址 78.子集 90.子集II

93. 复原 IP 地址

递归参数:index一定是需要的,记录下一层递归分割的起始位置。还需要一个变量pointNum,记录添加逗点的数量。

递归终止条件:明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。然后验证一下第四段是否合法,如果合法就加入到结果集里

单层搜索的逻辑:for (int i = startIndex; i < s.size(); i++)循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。如果合法就在字符串后面加上符号.表示已经分割。如果不合法就结束本层循环,剪掉的分支。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符.),同时记录分割符的数量pointNum 要 +1。回溯的时候,就将刚刚加入的分隔符. 删掉就可以了,pointNum也要-1。

出现问题

1.直接进行简单的判断s[start]==0,并没有判断出现0时候的位置

2.区间定义出现问题,isBaild里面函数是左闭右闭区间,然而在调用函数时进去的是左闭右开区间

class Solution {
public:
    vector<string> res;
    bool isValid(string &s,int start,int end){
        if(start>end)return false;
        if(s[start]=='0'  && start != end)return false;
        int num=0;
        while(start<=end){
            if(s[start]<'0'||s[start]>'9')return false;
            num = num * 10 + (s[start] - '0');
            if(num>255)return false;
            start++;
        }
        return true;
    }

    void backtracing(string &s,int index,int pointnum){
       if(pointnum==3){
           if(isValid(s,index,s.size()-1)){
              res.push_back(s);
              return; 
           }  
       }
        for(int i=index;i<s.size();i++){
            if(isValid(s,index,i)){
                s.insert(s.begin() + i + 1 , '.');  // 在i的后面插入一个逗点
                pointnum++;
                backtracing(s, i + 2, pointnum);   // 插入逗点之后下一个子串的起始位置为i+2
                pointnum--;  
                s.erase(s.begin() + i + 1);                    
            }
        }


    }
    
    vector<string> restoreIpAddresses(string s) {
        res.clear();
        backtracing(s,0,0);
        return res;
    }
};

78. 子集

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从index开始,而不是从0开始!

递归函数参数:全局变量数组path为子集收集元素,二维数组res存放子集组合。

递归终止条件:前面直接if(index<nums.size()),出现结果空集的情况,后面仔细一想,不用终止条件是不是也行

单层搜索逻辑:求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树

class Solution {
public:
    vector<vector<int>> res;
    vector<int> path;

    void backtracking(vector<int> &nums, int index){
        res.push_back(path);
        for(int i=index;i<nums.size();i++){
            path.push_back(nums[i]);
           
            backtracking(nums,i+1);
            path.pop_back();
        }
    }


    vector<vector<int>> subsets(vector<int>& nums) {
        res.clear();
        path.clear();
        backtracking(nums,0);
        return res;
    }
};

90. 子集 II

 

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集! 

递归函数参数:全局变量数组path为子集收集元素,二维数组res存放子集组合。需要一个used数组用于去重。

递归终止条件:子集问题可以不用写

单层搜索逻辑:求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(vector<int>& nums, int index,vector<bool> used){
        res.push_back(path);
        for(int i=index;i<nums.size();i++){
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false) continue;
            used[i]=true;
            path.push_back(nums[i]);
            backtracking(nums,i+1,used);
            used[i]=false;
            path.pop_back();
        }
    }

    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        path.clear();
        res.clear();
        sort(nums.begin(),nums.end());
        backtracking(nums,0,used);
        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Speech | 人工智能中语音质量评估方法详解及代码

本文主要讲解人工智能中语音合成&#xff0c;语音转换&#xff0c;语音克隆等生成语音的一些质量评估方法~ 目录 1.语音质量评测方法 主观评价方法 1.1.MOS 1.2.CMOS 1.3.ABX Test 1.4.MUSHRA&#xff08;MUltiple Stimuli with Hidden Reference and Anchor&#xff0…

Python爬虫-爬取豆瓣Top250电影信息

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

003集Class类应用实例—python基础入门实例

面向对象编程是一种编程方式&#xff0c;此编程方式的落地需要使用 “类” 和 “对象” 来实现&#xff0c;所以&#xff0c;面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板&#xff0c;模板里可以包含多个函数&#xff0c;函数里实现一些功能 对象则是根…

Hyperledger Fabric 自动发现网络信息 discover 工具使用

客户端要往 Fabric 网络中发送请求&#xff0c;首先需要知道网络的相关信息&#xff0c;如网络中成员组织信息、背书节点的地址、链码安装信息等。 在 Fabric v1.2.0 版本之前&#xff0c;这些信息需要调用者手动指定&#xff0c;容易出错&#xff1b;另外&#xff0c;当网络中…

2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景

目录 引言 Zset 集合命令 ZINTERSTORE ZUNIONSTORE Zset 编码方式 Zset 应用场景 排行榜系统 引言 在 Redis 中集合间操作无非就是 交集、并集、差集 Set 类型与之相对应的操作命令为 sinter、sunion、sdiff 注意&#xff1a; 从 Redis 6.2 版本开始&#xff0c;Zset 命…

可充电助听器有哪些优势?

可充电助听器有哪些优势 01 无需频繁更换电池&#xff0c;对于手指不灵活、眼神不好的老年用户以及无法自行更换电池的儿童用户&#xff0c;使用更为方便。 02 可充电助听器的电池一般密封在助听器内部&#xff0c;机身的防水防尘性能更强。 03 部分充电盒具有快充、储电、…

SNP分享:企业并购与拆分的关键成功因素

成功执行并购或拆分需要考虑的关键因素 合并、收购和资产剥离对CIO和CFO来说都是一项艰巨的任务&#xff1b;它们在业务和技术方面都具有很大影响力&#xff0c;企业并购或拆分在数据迁移方面需要考虑哪些关键因素&#xff1f; 一、在迁移中构建自动化 先确定要迁移、集成或剥离…

计算机体系结构流水线学习记录

一、知识点汇总 1.理想情况下&#xff0c;流水线能够实现 n 倍的吞吐率加速比&#xff08;n为流水线深度&#xff09;&#xff0c;但是流水线深度并非越大越好&#xff0c;因为流水线的深度会影响到性能和功耗之间的平衡。 2.RISC&#xff1a;Reduced Instruction Set Comput…

NetCore使用SixLabors组件生成图片

主要用到SixLabors.Fonts(2.1.0)和SixLabors.ImageSharp.Drawing(2.1.0)组件 这里我把组件创建成一个单独的类库&#xff0c;供其他模块来同意调用 ISixLaborsExtensions.cs using SixLabors.Fonts; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Drawing.Processi…

【算法Hot100系列】搜索旋转排序数组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

[AutoSar]基础部分 RTE 05 Port的实例化和初始化

目录 关键词平台说明一、端口类型二、端口的实例化2.1 创建application port2.2 实例化 三、初始化 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、端口类型 如下图所示&am…

一种DevOpts的实现方式:基于gitlab的CICD(一)

写在之前 笔者最近准备开始入坑CNCF毕业的开源项目&#xff0c;看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd&#xff0c;Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具&#xff0c;它以声明式的方式实现了应用程序的…

scipy-interpolate整理

文章目录 scipy-interpolate整理Univariate interpolation 单变量插值Multivariate interpolation 多元插值Unstructured data 非结构化数据&#xff1a;:For data on a grid 对于网格上的数据&#xff1a;:Tensor product polynomials 张量积多项式&#xff1a;: 1-D Splines …

Windows更新 遇到错误 你的设备中缺少重要的安全和质量修复 0x80070643问题解决

一、原因 日常Windows更新时&#xff0c;突然出现以下错误&#xff1a; 二、最简单的方法 官方网址windows10升级工具进行更新&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10/   更新助手可以帮助你更新到 Windows 10 的最新版本&#xff0c…

【刷题日记】青少年CTF-Misc(三)A1-Misc部分完结!撒花!

StegoTXT 题目难度&#xff1a;★ 题目编号&#xff1a;QSNCTF-2023-T-MISC-20230228003 题目描述&#xff1a;今天维护网站的时候出了一道这样的题目&#xff0c;上传上来看看大家怎么解&#xff0c;flag格式为&#xff1a;qsnctf{xxx}。 下载解压文件&#xff0c;得到一个…

海淘注意事项科普

关税和税费&#xff1a; 在海淘过程中&#xff0c;您可能需要支付关税和其他税费。了解目标国家的相关规定&#xff0c;预先了解可能的费用&#xff0c;并确保考虑到这些额外成本。 货币汇率&#xff1a; 注意货币汇率的波动&#xff0c;以避免因兑换率变化导致支付更多费用。…

嵌入式-C语言-江科大-指针的详解与应用

文章目录 一&#xff1a;计算机存储机制二&#xff1a;定义指针三&#xff1a;指针的操作四&#xff1a;数组与指针五&#xff1a;指针的应用道友&#xff1a;最清晰的脚印&#xff0c;踩在最泥泞的道路上。 推荐视频配合我的笔记使用 [C语言] 指针的详解与应用-理论结合实践&a…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本&#xff0c;导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞&#xff0c;因此导致网络安全问题 伪方法&#xff1a; 像这个马上就暴露出Python版本&#xff0c;如何解决这个网络上有说直接用response.headers.remove(Ser…

Windows内存管理(二):内存架构 浅谈一二

《Windows内存管理&#xff08;一&#xff09;&#xff1a;Windows性能监视器(PerfMon)》 Windows内存管理是一个复杂的主题&#xff0c;涉及多个层次和组件。以下是一个分层的概述。 1、虚拟内存管理 Windows使用虚拟内存来给每个进程提供一个看似连续的内存空间&#xff0c…

Java学习笔记-day01-Flowable工作流入门

课程来源B站大佬波哥的课程 本文仅做笔记&#xff0c;课件需要的联系B站大佬获取 0.前置 相关话术 流程定义&#xff08;Process Definition&#xff09;&#xff1a; 描述业务流程的定义&#xff0c;通常使用BPMN&#xff08;Business Process Model and Notation&#xff09…