Studying-代码随想录训练营day24| 93.复原IP地址、78.子集、90.子集II

第24天,回溯算法part03,牢记回溯三部曲,掌握树形结构结题方法💪

目录

93.复原IP地址

78.子集

90.子集II

总结 


93.复原IP地址

文档讲解:代码随想录复原IP地址

视频讲解:手撕复原IP地址

题目:

学习:本题属于切割类问题,不同的是本题需要使用 ' · ’ 来切割,并且本题对切割的数字大小和多少,切割多少次都有要求。但本质都是两步:1.切割;2.判断切割是否正确。

依据以上两点,本题和131.分割回文串不同的地方就在于对分割部分的判断和终止条件的选择。回溯逻辑用树形结构来表示为:

注意:判断分割部分是否合法,主要从三个部分出发:1.段位以0为开头且不止有0的数字不合法。2.段位里有非正整数字符不合法。3.段位如果大于255了不合法。

代码:确定回溯三部曲,注意本题要在字符串中加入' . ' 因此回溯的时候要删掉该点。

//时间复杂度O(3^4)
//空间复杂度O(n)
class Solution {
public://直接在字符串上进行操作,因此不设置路径数组vector<string> result; //返回数组//确定返回值和参数列表,直接在答案数组中插入因此不需要返回值,参数中需要原字符串s,分割点startindex//本题还需要一个int型变量point表示当前逗号的数量void backtracking(string& s, int startindex, int point) {//确定终止条件,当逗号数量为3个时,说明当前分割已经完成了if(point == 3) {//最后一部分字符串还需要进行判断if(ipvaild(s, startindex, s.size() - 1)) {result.push_back(s);}return;}//确定单层递归逻辑for(int i = startindex; i < s.size(); i++) {//startindex作为切割线,切割的字符串区间为[startindex, i],左闭右闭//判断切割下来的字符串是否合理if(ipvaild(s, startindex, i)){//如果合理的话,在字符串下标i后插入逗号,并进行下一轮递归s.insert(s.begin() + i + 1, '.');point++;//注意这里需要传入的是i+2,因为加了一个逗号,切割的位置需要往后移两位backtracking(s, i + 2, point);point--; //回溯s.erase(s.begin() + i + 1);}else {  //假如不满足,后续的切割方法也难以满足,直接跳出本层循环break;}}}bool ipvaild(string& s, int start, int end) {if (start > end) {return false;}//如果存在前置0的话,返回falseif(start != end && s[start] == '0') {return false;}int num = 0; //对切割字符串进行求和for(int i = start; i <= end; i++) {if(s[i] - '0' < 0 || s[i] - '0' > 9) {return false;}num = num * 10 + (s[i] - '0');if(num > 255) {return false;}}return true;}vector<string> restoreIpAddresses(string s) {backtracking(s, 0, 0);return result;}
};

本题可以进行剪枝,自认为本题可以从三个部分进行剪枝,分别是:1.剪枝1,给的字符串不满足切割有效的IP地址;2.剪枝2,分割实际只需要分割3个字符就行,缩小循环范围;3.每次切割后可以判断一下是否后面的字符还能够满足切割要求。

代码:

class Solution {
public://切割问题主要需要两点:切割,判断!//直接在字符串上进行操作,因此不设置路径数组vector<string> result; //返回数组//确定返回值和参数列表,直接在答案数组中插入因此不需要返回值,参数中需要原字符串s,分割点startindex//本题还需要一个int型变量point表示当前逗号的数量void backtracking(string& s, int startindex, int point) {//确定终止条件,当逗号数量为3个时,说明当前分割已经完成了if(point == 3) {//最后一部分字符串还需要进行判断if(ipvaild(s, startindex, s.size() - 1)) {result.push_back(s);}return;}//确定单层递归逻辑//剪枝2,分割只需要分割3个数字就够了for(int i = startindex; i < startindex + 3; i++) {//剪枝3,后续剩余的节点数不满足切割要求if(s.size() - startindex > (4 - point) * 3 || s.size() - startindex < (4 - point)) {break;}//startindex作为切割线,切割的字符串区间为[startindex, i],左闭右闭//判断切割下来的字符串是否合理if(ipvaild(s, startindex, i)){//如果合理的话,在字符串下标i后插入逗号,并进行下一轮递归s.insert(s.begin() + i + 1, '.');point++;//注意这里需要传入的是i+2,因为加了一个逗号,切割的位置需要往后移两位backtracking(s, i + 2, point);point--; //回溯s.erase(s.begin() + i + 1);}else {  //假如不满足,后续的切割方法也难以满足,直接跳出本层循环break;}}}bool ipvaild(string& s, int start, int end) {if (start > end) {return false;}//如果存在前置0的话,返回falseif(start != end && s[start] == '0') {return false;}int num = 0; //对切割字符串进行求和for(int i = start; i <= end; i++) {if(s[i] - '0' < 0 || s[i] - '0' > 9) {return false;}num = num * 10 + (s[i] - '0');if(num > 255) {return false;}}return true;}vector<string> restoreIpAddresses(string s) {//剪枝1,给的字符串不满足切割有效的ip地址if(s.size() < 4 || s.size() > 12) return result;backtracking(s, 0, 0);return result;}
};

78.子集

文档讲解:代码随想录子集

视频讲解:手撕子集问题

题目:

学习:回溯算法能够解决的第三类问题,子集问题。子集问题与切割问题和组合问题的本质不同在于,切割问题和组合问题都是在叶子节点收获结果,但是子集问题需要在每个节点都收获结果,这也导致了子集问题对result数组push_back的位置不同,但其他部分其实几乎是一致的。子集问题其实也能看作是一个组合问题,因此也需要注意去重。回溯逻辑转化为树形结构为:

代码:确定回溯三部曲

//时间复杂度O(n*2^n)
//空间复杂度O(n)
class Solution {
public:vector<vector<int>> result; //返回数组vector<int> path; //保存路径//确定返回值和参数列表,在数组中直接进行操作,所以不需要返回值,参数列表需要遍历的数组和当前遍历的下标void backtracking(vector<int>& nums, int startindex) {//子集问题的不同在于,子集收获答案是在每个节点均收货一次//在终止条件前,先进行收获,其中也包含了空集result.push_back(path);//确定终止条件(其实等于就可以了),遍历到最后//该终止条件也可以不写,因为当startindex >= nums.size()时,下面的for循环也不会进入,但要注意for循环后加return。if(startindex >= nums.size()) {return;}//确定单层递归逻辑for(int i = startindex; i < nums.size(); i++) {path.push_back(nums[i]);//传入i+1,防止出现重复backtracking(nums, i + 1);path.pop_back();}return;}vector<vector<int>> subsets(vector<int>& nums) {backtracking(nums, 0);return result;}
};

90.子集II

文档讲解:代码随想录子集II

视频讲解:手撕子集II

题目:

学习:本题和上一题不同点在于本题存在重复元素,需要对后续的相同元素进行去重,事实上本题和组合总和II的去重是相同的,本质都是如果后面出现了与前面相同的元素就可以跳过该元素的遍历,因为前面的元素一定把后面的元素还有的组合都包括的。基于此本题可以采取和40.组合总和II相同的去重方式,都是在树层进行去重

代码:确定回溯三部曲

//时间复杂度O(n*2^n)
//空间复杂度O(n)
class Solution {
public:  vector<vector<int>> result; //返回答案数组vector<int> path; //保存路径//确定参数和返回值void backtracking(vector<int>& nums, int startindex) {//收集每一个节点result.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();}return;}vector<vector<int>> subsetsWithDup(vector<int>& nums) {//进行排序,便于去重sort(nums.begin(), nums.end());backtracking(nums, 0);return result;}
};

总结 

切割问题首尾,子集问题开始,牢记子集问题和切割问题和组合问题的不同。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何利用python画出AHP-SWOT的战略四边形(四象限图)

在企业或产业发展的相关论文分析中&#xff0c;常用到AHP-SWOT法进行定量分析&#xff0c;形成判断矩阵后&#xff0c;如何构造整洁的战略四边形是分析的最后一个环节&#xff0c;本文现将相关代码发布如下&#xff1a; import mpl_toolkits.axisartist as axisartist import …

解决本机电脑只能通过localhost访问,不能通过127.0.0.1访问

背景问题 有天我启动项目&#xff0c;发现项目连接Mysq总是连接不上&#xff0c;查了url、ip、port、用户名和密码都没有错&#xff0c;就是连接不上mysql数据库&#xff0c;后来通过查找资料发现有多个进程占用3306端口。 pid 6016 是mysqld服务 而pid 9672 是一个叫 svchos…

逆变器--学习笔记(一)

并网&#xff1a; 逆变器中的“并网”指的是逆变器将其产生的交流电与电网同步&#xff0c;并输送到公共电网中。并网逆变器通常用于太阳能发电系统和其他分布式发电系统&#xff0c;将其产生的电能输送到电网供其他用户使用。 THD谐波失真总量: 逆变器的THD&#xff08;Tot…

大模型系列课程学习-基于2080TI-22G魔改卡搭建双卡大模型训练平台(双系统)

1.选择合适的硬件配置 再配置电脑之前&#xff0c;需要确认自己需要的显存大小、主板、内存条、电源、散热等核心配件。经过前期调研&#xff0c;选择的硬件配置如下&#xff1a; &#xff08;1&#xff09;主板&#xff1a;华南X99_F8D(DDR4主板)&#xff0c;因为需要支持双卡…

Python: PyCharm 2023.1 调试

1.设断点 &#xff08;行号对应的红色点&#xff0c;在需要设置断点的代码行与行号之间鼠标点击即可以设置&#xff09; 2.shiftF9,或 altshiftf9 选择文件 或是在菜单 Run->debug "main" 或是在菜单Run->debug 选择文件 &#xff08;鼠标光标放在设置第一个…

DDD学习笔记四

领域模型的构建 基础领域模型的基本组成有名称、属性、关联、职责、事件和异常 发掘领域概念3种策略&#xff1a; 1&#xff09;学习已有系统&#xff0c;重用已有模型 2&#xff09;使用分类标签。分类标签来源于领域&#xff0c;需要我们研究一些资料并做一些提炼。从采用5W…

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

汇川CodeSysPLC教程03-2-10 如何组态

大家好&#xff0c;我是阿凡工控分享&#xff0c;本期我们将调整教程的顺序&#xff0c;和粉丝朋友们讨论后&#xff0c;后续我将优先出绿旗标注的部分&#xff0c;便于小白水平的你循序渐进&#xff0c;其他水平的朋友有些需求可能要稍后了&#xff0c;如果有问题请见谅&#…

【Spring成神之路】一次SpringIOC源码之旅,女朋友也成为了Spring大神!

文章目录 一、前言二、前置准备三、IOC容器的使用四、Spring IOC源码解读1. prepareRefresh源码解读2. obtainFreshBeanFactory源码解读2.1 refreshBeanFactory源码解读 3. prepareBeanFactory源码解读4. postProcessBeanFactory源码解读5. invokeBeanFactoryPostProcessors源码…

计算机Java项目|基于SpringBoot的作业管理系统设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

Lumos学习王佩丰Excel第三讲:查找替换定位

一、查找和替换 1、按值查找 2、按格式查找 将红色的单元格替换成黄色的单元格&#xff0c;其他格式同理处理。 3、是否开启单元格匹配 若不打开选项卡直接全部替换&#xff0c;会出现“苏州市市”的情况&#xff1b;加入单元格匹配的规则&#xff0c;检索时会以整个单元格内…

运维.Linux下执行定时任务(上:Cron简介与用法解析)

运维专题 Linux下执行定时任务&#xff08;上&#xff1a;Cron简介与用法解析&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAd…

AI陪伴产品的情感设计:从孤独感到恋爱感评分:9/10

本文主要阐述三个话题&#xff1a; 1. 市面上有哪些AI陪伴产品&#xff1f; 2. 我们团队要怎么做&#xff1f; 3. 为什么要做&#xff1f; 市面上有哪些陪伴类产品&#xff1f; Role-play&#xff08;角色扮演&#xff09; 在当前市场上&#xff0c;有不少以角色扮演为核心的…

灵魂拷问,如何应对平行志愿的天坑?

高考填报志愿实行平行志愿&#xff0c;关于这个概念这里不重复说&#xff0c;不了解平行志愿的可以百度补课&#xff0c;这里只说平行志愿的坑挖得实在太大了&#xff0c;以至于很多同学都入坑了&#xff0c;怎么办&#xff1f; &#xff08; 欢迎 评论区 咨询 and 交流....&am…

淀山湖之行随笔

我们仰望清新&#xff0c;但又不得不被世俗所伴。 近日上海开始进入梅雨季节&#xff0c;每天大大小小的雨水不断&#xff0c;整个环境也格外的潮湿&#xff0c;不过已经逐渐习惯这种气候&#xff0c;所谓的见怪不怪。 今日是周日&#xff0c;思绪好久&#xff0c;准备去淀山湖…

前端优化:首屏加载速度的实践

目录 目录 前言 多图片的懒加载 避免用户多次点击请求 骨架屏原理 结束语 前言 随着互联网技术的飞速发展&#xff0c;前端网页逐渐取代了传统客户端成为用户获取信息、进行交互的重要渠道&#xff0c;但是网页也有常见的弊端&#xff0c;比如网页首屏加载速度的快慢直接…

vant 图片放大预览(vue3)

最近在写移动端的时候要实现图片放大预览的功能&#xff0c;当时用的是vant&#xff0c;原本想的是直接用vant里面的组件来实现放大预览&#xff0c;后面仔细找了一下发现没有找到这个功能&#xff08;可能是我没找到&#xff09;&#xff0c;后面想到了用遮罩层来实现放大预览…

捕获野生的登录页,暴改Vue3

1.实现效果 2.Vue组件 <script setup> import {onMounted} from "vue";onMounted(()>{// getAllData() }) </script><template><div class"login"><div class"form-cont"><div class"form-top"&…

全面解析自然语言处理(NLP):基础、挑战及应用前景

自然语言处理 (NLP) 简介与应用前景 自然语言处理&#xff08;NLP&#xff09;是人工智能和计算语言学的一个分支&#xff0c;致力于使计算机能够理解、解释和生成人类语言。这篇博文将深入探讨自然语言处理的基础知识、挑战、典型任务及其广泛的应用前景。 一、自然语言处理的…