代码随想录Day28 |93.复原IP地址 78.子集 90.子集II

stm32学习笔记:ADC 阅读详情

代码随想录Day28 |93.复原IP地址 78.子集 90.子集II

93.复原IP地址

文档讲解:代码随想录
视频讲解: 回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址
状态:

本题本质也是分割字符串,只不过根据IP地址,必须分割三次,每一段最多三个数,所以对于原始字符串其长度应当在4-12

  1. 终止条件:当我们分割了3次就应该停止分割,所以我们应当在递归函数的参数中传入一个数来统计当前的递归层数
  2. 单层递归逻辑:同样是对于每一层使用i来控制划分的字符串,然后判断该字符串是否是合理的ip字段,如果合理那么就加入,然后递归,递归结束后再回溯
    具体代码
//只能分割3次,
//每一段最多三个数
//s的长度4-12
class Solution {
private:
    vector<string> res;
    string ippath;

public:
    bool checkpath(string s)
    {
        //当当前字段长度大于3或者为空,不应该添加
        if(s.size()>3 || s.size() == 0)
        {
            return false;
        }
        //当当前字段长度大于1,但首字母为0,也要跳过
        if(s.size()>1 && s[0] == '0')
        {
            return false;
        }
        int num = 0;
        for(int i = 0;i<s.size();i++)
        {
            int temp = s[i]-'0';
            num *= 10;
            num += temp;
        }
        //当当前字段的大小大于255 跳过
        if(num > 255)
        {
            return false;
        }
        return true;
    }

    void getIp(string s,int startIndex,int count)
    {
        //当分割了3次,开始准备填入结果数组
        if(count == 3)
        {
            //验证剩余的字段是否合理,合理的话就添加
            //不合理说明这组分割都不合理就舍去
            string str = s.substr(startIndex,s.size());
            if(checkpath(str))
            {
                ippath += str;
                res.push_back(ippath);
            }
            
            return;
        }
        for(int i = startIndex;i<s.size();i++)
        {
            //分割字符串
            string str = s.substr(startIndex,i-startIndex+1);
            //记录添加前的长度,方便回溯
            int len = ippath.size();
            if(checkpath(str))
            {
                //合理的话,就添加str
                ippath += str;
                ippath += '.';
                getIp(s,i+1,count+1);
                //回溯
                ippath.erase(len,len+str.size()+1);
                cout << ippath;
            }
        }
        return ;
    }
public:
    vector<string> restoreIpAddresses(string s) {
        if(s.size()<4 || s.size()>12)
        {
            return {};
        }
        getIp(s,0,0);
        return res;
        
    }
};

78.子集

文档讲解:代码随想录
视频讲解: 回溯算法解决子集问题,树上节点都是目标集和! | LeetCode:78.子集
状态

这道题就是要记录每一层的每一个节点的结果,那么我们需要在每一层递归开始的时候就需要压入返回数组。

  1. 返回条件:就是当现在这个节点是数组最后一个数的时候就需要返回了,那么就是startIndex == nums.size(),因为还需要将最后一个记过压入res中。
    在这里插入图片描述
    具体代码
//对于每一个结果都需要存储到数组中
class Solution {
private:
    vector<vector<int>> res;
    vector<int> path;
public:
    void getSets(vector<int>& nums, int startIndex)
    {
        
        if(startIndex >= nums.size())
        {
            res.push_back(path);
            return;
        }
        else
        {
            res.push_back(path);
        }
        for(int i= startIndex;i<nums.size();i++)
        {
            path.push_back(nums[i]);
            getSets(nums,i+1);
            path.pop_back();
        }
        return ;
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        getSets(nums,0);
        return res;
    }
};

90.子集II

文档讲解:代码随想录
视频讲解: 回溯算法解决子集问题,如何去重?| LeetCode:90.子集II
状态

这个需要去重,思考去重的逻辑,只需要对处于同一层的重复元素进行跳过操作,对一个树枝上的重复元素可以保留。
去重之前先排序!!!
和之前一样利用一个used数组记录判断当前的元素和前一个元素是否在同一层还是同一级。
具体代码

class Solution {
private:
    vector<vector<int>> res;
    vector<int> path;
public:
    void getSets(vector<int>& nums, vector<int> used, int startIndex)
    {
        res.push_back(path);
        if(startIndex == nums.size())
        {
            return;
        }
        for(int i = startIndex;i<nums.size();i++)
        {
            if(i>0 && used[i-1] == 0 && nums[i-1] == nums[i])
            {
                continue;
            }
            used[i] = 1;
            path.push_back(nums[i]);
            getSets(nums,used,i+1);
            path.pop_back();
            used[i] = 0;
        }
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<int> used(nums.size());
        sort(nums.begin(),nums.end());
        getSets(nums,used,0);
        return res;
    }
};
【异常】Codybuddy Error Code: 14003 too many requests 限流报错问题排查与解决指南 14003报错本质为服务端限流拦截,并非账号封禁或程序致命故障,90%以上的场景可通过等待冷却+规范使用行为解决。通过本文的排查步骤,可快速恢复工具使用,同时规避后续重复触发该问题。 阅读详情

相关推荐

国科大 雁栖湖校区 研一上 课程避坑与生存指南

本文为国科大雁栖湖校区研一新生提供全面的课程避坑与生存指南,涵盖选课策略、核心课程学习技巧、校园生活攻略及心态管理。重点解析算法设计与分析、人工智能原理等硬核课程的学习方法,并分享食堂、住宿、自习室等实用生存技巧,帮助新生高效适应研究生生活。

weixin_29304985的博客 300

代码随想录Day28|93.复原IP地址、78.子集、90.子集II

93.复原IP地址、78.子集、90.子集II

weixin_46620779的博客 1463

[亚信线上教学] AX58100: EtherCAT从站设备仿真功能设计教学

什么情况需要开启EtherCAT从站设备仿真功能呢? 一般来说, 当EtherCAT从站产品,不需要使用额外的微控制器介入,或使用不具备EtherCAT从站通讯协议栈的微控制器一同协作的情况下,就必须开启EtherCAT从站设备仿真功能,这样EtherCAT主站才能够正常设置从站设备的工作状态. 亚信AX58100 EtherCAT从站控制芯片的优点 AX58100 EtherCAT从站控制器, 集成2个百兆以太网Phis, 并支持一些额外的控制接口, 例如脉冲宽度调变, 增量, 霍尔编码器, .

allanchou1的专栏 7422

代码随想录算法训练营day28 | 93.复原IP地址、78.子集、90.子集II

LeetCode | 93.复原IP地址、78.子集、90.子集II

weixin_69675605的博客 878

大疆无人机图像传输延时优化全解析:从Lightbridge到OcuSync的实战技巧

本文深入解析大疆无人机图像传输延时优化,对比Lightbridge与OcuSync两大核心通信协议的技术差异与实战表现。文章详细拆解了从传感器采集到屏幕显示的完整延时链条,并提供了从环境频段选择、硬件升级到软件设置的全方位优化技巧,帮助飞手与开发者显著降低图传延时,提升操控体验与作业效率。

weixin_29163857的博客 305

【例1896】report all clearance datasets 报告所有间隙数据集

report all clearance datasets 报告所有间隙数据集》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 643

零基础代码随想录【Day28】|| 93.复原IP地址 ,78.子集,90.子集II

示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

Andrew______的博客 755

基于物联网的门禁与考勤系统(阿里云)_81

本课题设计的基于物联网的门禁与考勤管理系统,结合现代信息技术,利用指纹识别、射频卡、密码输入和远程控制等多种开锁方式,提升门禁系统的安全性和灵活性;同时,通过物联网平台进行数据上传和远程管理,极大提高了管理效率。通过智能化的考勤功能,系统可以实时记录员工的出入情况,并通过云平台进行远程查询和管理,推动门禁与考勤管理的数字化、智能化和高效化。

1万+

代码随想录day28 93.复原IP地址 78.子集 90.子集II

子集问题,回溯

weixin_55496975的博客 319

二十一、CANdelaStudio深入-SPRMIB的配置

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的肯定响应抑制位配置,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YO CANdelaStudio-从入门到深入目录 文章目录CANdelaStu

诊断协议那些事儿's blog 1869

走向审计4.0:内部审计数字化转型的路径与方法

企业的内部审计人员可以以数字化为手段,建立内部审计新生态,在数字化过程中引进战略审计、服务审计、开放审计、敏捷审计、数字审计、智慧审计等理念、方法和工具,完成数智生态审计转型。内部审计的审计对象远比国家审计和公众审计丰富和多元化,理论上企业经营管理和日常操作的各个方面都可以成为内部审计的对象,此外还可以开展独立咨询活动。由于内部审计的数字化或数字化的内部审计是实现审计数字化转型的必要条件,是实现“数字引领、数据强审”目标的核心手段,因此企业内部审计部门势必要投入足够的资金和人才来打造一支数字化审计新队伍。

一键难忘的博客 6737

代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90

首先就是如何实现字符串的切割:这里用到的方法和上面分割回文字符串相同,也就是通过 index 表示本次切割的起点,通过循环变量 i 表示切割的终点。的朋友对这种题目一定不陌生,这道题目其实就是 组合总和II 与上一题 子集的结合,组合总和II 的详解在这里,建议先做完再来尝试本题。本题的特点就是题目中出现了有相同元素的数组,所以需要做到层级去重,收集结果的方式和上面一题完全相同,这里直接给出代码。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

kkq的博客 1313

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1570

代码随想录刷题day28 93.复原IP地址;78.子集;90.子集II

代码随想录刷题day28

weixin_43127049的博客 138

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

代码随想录算法训练营DAY28|C++回溯算法Part.4|93.复原IP地址、78.子集、90.子集II

递归终止条件:本题题目明确要求只分四段,也就如上文所说,3个pointNum就说明字符串分成四段了,我们检查一下第四段是否合法,就可以放入到结果集中了。状态:一种十分典型的分割问题,根据IP地址的特征从分割一个字符、两个字符、三个字符推进,但是其中肯定是要进行剪枝的。但是究其本质,子集问题仍然是一个组合问题,因为它的集合是无序的,子集{1, 2}{2, 1}是一样的。递归终止条件:从树形结构可以看出,剩余集合为空的时候,我们的递归就结束了。这种分割问题,我们一定要用暴力枚举每一种分割的情况。

糖炒栗子 1196

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

代码随想录 -- day28 -- 93.复原IP地址 、78.子集 、90.子集II

我们在[startIndex, i]中截取来判断是否满足是IP地址,满足的话就在i + 1地方加一个".",记住继续递归的时候是从i + 2这个位置开始。因为被分成四段,所以pointNum为3个的时候是满足的,然后在判断是否可以作为IP,可以的话就加入result。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了。这个和之前的去重思路一样,树层上去重。剩余集合为空的时候,就是叶子节点。

Accelerated的博客 1038

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

代码随想录【Day28】| 93. 复原 IP 地址、78. 子集、90. 子集 II

回溯,分割问题,组合问题

傅里叶变不出的博客 479

代码随想录day28|93. 复原 IP 地址|78.子集|90.子集II|Golang

笔记

weixin_42161901的博客 703

代码随想录算法训练营day28 | 93.复原IP地址,78.子集,90.子集II

子集问题需要在每个节点收集数据,因此result新增元素操作要放在backtracking函数开头.

2301_77450803的博客 481

代码随想录算法训练营day28|LeetCode 93 复原 IP 地址、LeetCode 78 子集、LeetCode 90 子集 II

代码随想录算法训练营day28

qq_51588716的博客 300

代码随想录算法训练营day28|93.复原IP地址、78.子集、90.子集II

本题就是40.组合总和II 和 78.子集这两道题目的结合。这道题同样也是切割问题,从图中红线部分,可以看出。

weixin_64883584的博客 439

代码随想录算法营DAY28 | 93.复原IP地址 78.子集 90.子集II

代码随想录算法营DAY28 | 93.复原IP地址 78.子集 90.子集II

chizi62的博客 252

代码随想录二刷 day28 | 回溯 之 93.复原IP地址 78.子集 90.子集II

回溯 之 93.复原IP地址 78.子集 90.子集II

baimaozi_007的博客 202

代码随想录刷题day28 | 93. 复原 IP 地址、78.子集、90.子集II

代码随想录刷题day28

weixin_40323978的博客 416

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

情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。删掉就可以了,pointNum也要-1。

baimaozi_007的博客 975

代码随想录 Day28 93.复原IP地址 78.子集 90.子集II

结合下图就可以理解,在取得前一个的相同元素的基础上,我们才可以再去取新的相同的元素,如果说并没有去前面那个相同的元素的话,取这个就必然会出现相同的情况。2. 在backtracking函数for循环中如果一个切割不行的话后面再加上一些数字也肯定不行,所以这个地方的处理都是在valid中,如果不是有效的话,就直接退出循环就可以了,而不是像其他题目的情况一样,需要continue考虑在加上一些字符可能成立的情况。1. 此处s[i]单个字符串s[i] - '0'可以转换为字符,如果是多个字符的话不行。

weixin_61057535的博客 454
上一篇: 代码随想录Day27 | 39. 组合总和 40.组合总和II 131.分割回文串
下一篇: 代码随想录Day29 | 491.递增子序列 46.全排列 47.全排列 II
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值