当前位置: 首页 > news >正文

day 24

day 24|

93. 复原IP地址

93.复原IP地址 | 代码随想录

笔记

本题和上一个分割回文串很像,先复习一下为什么分割问题和组合问题很像:

组合问题:在“abcd”中选择a,然后继续在剩余的“bcd”中选择b......

分割问题:在“abcd”中先分割一个a出来,然后在“bcd”中分割b......

分割问题可以抽象为一个树形结构,所以可以使用回溯算法解决。

树形结构中,第一层表示第一次切割,第二层表示第二次切割......

实操出现问题

1.string的一些常用操作还不熟悉

2.和上一个题目进行比较,这个题目中如果不合法,直接break,但是上一个题目如果不是回文串,应该continue,原因就在于一旦不合法,后边更长的子串一定不合法;而对于上一个题目,小一点的子串可能不合法,但是长一点的子串就有可能合法了。

for循环是横向的搜索,迭代是纵向的搜索,continue就代表了本题的横向剪枝了

代码/比较

class Solution {
private:
vector<string> result;//判断是否合法
bool isIP(string s,int startindex,int i)
{if(i<startindex)return false;//startindex是起始位置,i是终止位置,//如果起始位置是0,则子串非法//在上个的基础下,如果子串转换为int后大于255,非法//如果出现字母,返回falsestring str=s.substr(startindex,i-startindex+1);char first=str[0];if(first=='0'&&startindex!=i)return false;int num=0;//用于转换for(int j=0;j<str.size();j++){if(str[j]>'9'||str[j]<'0')return false;num=num*10+(str[j]-'0');if(num>255)return false;}return true;
}
void backtracking(int startindex,string s,int num)
{//截止条件:如果分割为四个子串(即分割了三次),则存储结果if(num==3){if(isIP(s,startindex,s.size()-1))result.push_back(s);return;}//单层搜索逻辑:判断当前分割出来的子串是否合法,如果合法则放入path中,不合法则返回,for(int i=startindex;i<s.size();i++){if(isIP(s,startindex,i))//如果合法,则插入逗点,并继续递归{s.insert(s.begin()+i+1,'.');backtracking(i+2,s,num+1);s.erase(s.begin()+i+1);}else break;}return ;
}public:vector<string> restoreIpAddresses(string s) {result.clear();backtracking(0,s,0);return result;}
};

78.子集

笔记:

和之前唯一区别就是这个题目是在每一个树结点处就应该放进result中(之前是在叶子节点才放入);要注意的是每一次都要放进去。

代码:

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(vector<int> nums,int stratIndex){//终止条件:如果到了叶子节点返回;但是在每次循环前都要收集结果result.push_back(path);if(stratIndex>=nums.size())return;//单层搜索逻辑:for(int i=stratIndex;i<nums.size();i++){path.push_back(nums[i]);backtracking(nums,i+1);path.pop_back();}return;}
public:vector<vector<int>> subsets(vector<int>& nums) {path.clear();result.clear();backtracking(nums,0);return result;}
};

90.子集 II

笔记:

和之前的去重问题一摸一样,不用多注意什么了,再加上了上个问题中的提前收集结果,没什么其他知识点。

class Solution {
private:vector<int> path;vector<vector<int>> result;void backtracking(int stratIndex,vector<int> nums,vector<bool> used){result.push_back(path);//截止条件:如果startIndex超过界限,退出if(stratIndex>=nums.size())return;//单层搜索逻辑:for(int i=stratIndex;i<nums.size();i++){//去重,树层去重if(i>0&&nums[i]==nums[i-1]&&used[i-1]==0)continue;else{path.push_back(nums[i]);used[i]=true;backtracking(i+1,nums,used);used[i]=false;path.pop_back();}}return;}
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {//首先要排序sort(nums.begin(),nums.end());vector<bool> used(nums.size(),false);backtracking(0,nums,used);return result;}
};

1

http://www.jsqmd.com/news/382460/

相关文章:

  • 如何通过提示词优化,实现 AI 辅助编码的高质量输出 - 教程
  • 对于梳理mysql和jdbc,以及hikiria三者依赖的关系
  • 嵌入式与边缘设备常用安全工具速通
  • 稀疏文件(Sparse file)是什么?
  • GEO成数字营销新战场,核心优化要素深度解析
  • 详细介绍:【WSL】安装并配置适用于Linux的Windows子系统(WSL)
  • 建议收藏|千笔ai写作,专科生论文写作利器
  • 题解:AT_abc435_e [ABC435E] Cover query
  • 迈向深空:软件工厂如何破解载人登月火箭软件研制难题
  • 聚焦2026年2月工业纸箱企业推荐排行,选箱不用愁,纸盒/农产品纸箱/纸箱/彩印包装/工业纸盒,工业纸箱直销厂家排行 - 品牌推荐师
  • 前后端分离交通管理在线服务系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 前后端分离流浪动物救助网站系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • Verilog源码实现FPGA与ET1100通信的EtherCAT从站方案
  • 企业级校园组团平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 7天读懂MySQL|特别篇:MVCC详解 - 详解
  • 2025平台货架实力厂家盘点,选对合作伙伴!自动化立体库/仓储货架/隔板货架/重型货架/轻型货架,平台货架公司推荐榜 - 品牌推荐师
  • Python文本为什么会乱码?从根源到解决方案的深度解析
  • 2026靠谱MBR膜厂家大排行,快来一探究竟,纯水反渗透膜/MBR膜污水处理设备,MBR膜源头供应厂家哪家好 - 品牌推荐师
  • 定稿前必看!8个降AIGC软件测评:本科生降AI率必备工具推荐
  • 中文乱码恢复方案
  • Linux USB应用开发学习笔记
  • 赶deadline必备!千笔ai写作,备受喜爱的AI论文写作软件
  • 小丑牌游记
  • 摆脱论文困扰!顶尖配置的AI论文网站 —— 千笔·专业学术智能体
  • 苏州靠谱家教一对一收费多少?2026年最新价格解析,上门家教/一对一家教试听课/全托一对一/大学生家教,家教老师怎么选择 - 品牌推荐师
  • 阿里面试:订单创建失败,积分却扣了?分布式事务 TCC / Seata / Saga 到底选哪个?TCC的三个坑,90%的人答不上来!
  • 横评后发现 9个降AI率软件降AIGC网站:自考降AI率必备工具全测评
  • 西门子Smart200 PLC锁机方案:分期、验证码与无限次加密探索
  • Difference between BeanFactory and FactoryBean in Spring
  • [特殊字符] AI闪应用爆火!超算互联网,免费托管你的创意!