007.复原 IP 地址
1.题目链接:
93. 复原 IP 地址
2.解题思路:
2.1.题目要求:
给定一串只包含数字的字符串s,返回所有让 s 构成 有效IP地址 的数字组合。
有IP地址: 4个 [0,255] 范围内的数字 组成,并且整数之间用 " . " 分隔。
注意:你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
注意:数字除了数字 0 ,其他数字前面不能有前导 0 ,比如 01、011、0111。
2.2.思路:
用N叉树的思路做,终止条件是,当 s 已经得到了 4个 [0,255] 范围内的数字 就输入结果集,
单层搜索,搜索的过程中不断判断搜集的 s 子串是不是符合 [0,255] 范围内的数字 的条件,符合就加个 . 在子串后面。
2.3.回溯三部曲:
2.3.1.确定回溯函数参数
这题没path,直接分割 " . " 分割 s 可以startIndex: 搜索的起始位置,pointNum:添加逗点的数量,这个在终止条件上回说明。
代码如下:
vector<string> result;// 记录结果
void backtracking(string& s, int startIndex, int pointNum) {
2.3.2.确定终止条件
当 s 已经得到了 4个 [0,255] 范围内的数字 就输入结果集,在具体代码中用 pointNum 的数量有没有达到 3 来判断,达到 3 代表已经可以构成IP地址了,
注意:到第三个 " . " 后面的字符,因为代码没有到for循环就需要判断了,需要额外判断到第三个 " . " 后面的字符是不是合法的,合法分割后的 s 输入 结果集,不合法就返回,接下来继续遍历或是结束。
代码如下:
if (pointNum == 3) { // 逗点数量为3时,分隔结束// 判断第四段子字符串是否合法,如果合法就放进result中if (isValid(s, startIndex, s.size() - 1)) {result.push_back(s);}return;
}
2.3.3.确定单层遍历逻辑
搜索的过程中递归或回溯都需要更新 pointNum 的数量,同时不断判断分割的子串是不是合法的,合法的就分割,不合法就终止本层递归的for循环。
向下一层递归的时候,因为 i 的后面加上 ' . ' ,所以 i + 1 变成了 i + 2。
循环中 [ startIndex, i ] 这个区间是需要截取的子串,
代码如下:
for (int i = startIndex; i < s.size(); i++) {if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法s.insert(s.begin() + i + 1 , '.'); // 在i的后面插入一个逗点pointNum++;backtracking(s, i + 2, pointNum); // 插入逗点之后下一个子串的起始位置为i+2pointNum--; // 回溯s.erase(s.begin() + i + 1); // 回溯删掉逗点} else break; // 不合法,直接结束本层循环
}
判断不合不合法的逻辑如下:
主要是这三点,
- 段位以0为开头的数字不合法
- 段位里有非正整数字符不合法
- 段位如果大于255了不合法
代码如下:
// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法
bool isValid(const string& s, int start, int end) {if (start > end) {return false;}if (s[start] == '0' && start != end) { // 0开头的数字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法return false;}num = num * 10 + (s[i] - '0');//字符串 转 数字 num= 10*num+(*str-'0');if (num > 255) { // 如果大于255了不合法return false;}}return true;
}
2.4.总代码:
class Solution {
private:vector<string> result;// 记录结果// startIndex: 搜索的起始位置,pointNum:添加逗点的数量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum == 3) { // 逗点数量为3时,分隔结束// 判断第四段子字符串是否合法,如果合法就放进result中if (isValid(s, startIndex, s.size() - 1)) {result.push_back(s);}return;}for (int i = startIndex; i < s.size(); i++) {if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法s.insert(s.begin() + i + 1 , '.'); // 在i的后面插入一个逗点pointNum++;backtracking(s, i + 2, pointNum); // 插入逗点之后下一个子串的起始位置为i+2pointNum--; // 回溯s.erase(s.begin() + i + 1); // 回溯删掉逗点} else break; // 不合法,直接结束本层循环}}// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法bool isValid(const string& s, int start, int end) {if (start > end) {return false;}if (s[start] == '0' && start != end) { // 0开头的数字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法return false;}num = num * 10 + (s[i] - '0');if (num > 255) { // 如果大于255了不合法return false;}}return true;}
public:vector<string> restoreIpAddresses(string s) {result.clear();if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了backtracking(s, 0, 0);return result;}
};
3.遇见的问题:
这题是加了 " . " 就直接输入给result返回了?都不把除了合法的那四段之外的数字字符删除吗?
题目意思理解错了,这一句话没注意到。
"你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。"
for循环判断不合法break,直接循环就终止了吗?
定义混淆了,是那个时候递归的for终止。
那不用break,return可以吗?
可以去试试。——可以
什么时候会用上这个条件?
01代码:
if (start > end) {return false;}
虽然这个一眼看上去确实,但是什么情况下会出现这种情况...不明白
删掉这段代码后,测试案例中上图画圈的是没通过的,可以看出来是判断第三个 ' . ' 后面的子串符不符合题目要求的逻辑出错,这里start(startIndex传入),end( s.size() - 1传入)是需要01代码来返回false,start在 ' . ' 后面一位,end是 s.size() - 1 是等于 ' . ' 的位置的,
也就是说满足 start > end 。
还有这种操作?刚好三个点切割完,然后出现这种情况..好吧
4.记录:
学的效率有点慢,可能精力给内耗掉了。学累了?。
007.复原 IP 地址相关推荐
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- java实现复原IP地址,回溯算法:复原IP地址
93.复原IP地址 题目地址:https://leetcode-cn.com/problems/restore-ip-addresses/ 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地 ...
- 回溯算法——复原IP地址(Leetcode 93)
题目选自Leetcode 93.复原IP地址 由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法,对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案. 通俗来讲,就是 ...
- LeetCode93. 复原IP地址
93. 复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 输入"010010" 输出["0.10.0.10","0. ...
- 93. 复原 IP 地址
93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...
- leetcode系列-93.复原 IP 地址
leetcode系列–第93题.复原 IP 地址 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔.例如:" ...
- LeetCode 第 93 题:复原IP地址(C++)
93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...
- leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)
文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...
最新文章
- 企业级 SpringBoot 教程 (三)SpringBoot用JdbcTemplates访问Mysql
- 【R】函数-字符处理函数
- oracle易忘函数用法(5)
- sqlnet.expire_time and idle_time
- Kernel panic -not syncing:Attempted to kill init!
- 你被这些网络迷题难倒过吗?
- 烂泥:IE6绿色中文版,支持在Win7、Win8下完美运行
- jQuery源码学习之五 (jQUery继承方法)
- 【Proteus仿真】220V转5V向单片机供电
- 正则匹配新闻内容案例,JS和PHP
- 数据库服务器操作系统升级方案,PostgreSQL 数据库跨版本升级常用方案解析
- 价值连城 知名深度强化学习Pieter Abbeel的采访 给机器学习 深度学习 和机器人学研究者从业者的建议
- 什么是configmap资源、secret资源(实战)
- Excel做题记录——整数规划优化模型
- 侠客工具盒 v5.0 build 0313 bt
- WPS 二维表格匹配方式(利用VLOOKUP+IF/SWITCH多条件查询)
- kalibr fov畸变模型
- 机器视觉中的光源选型及打光方案分析
- 电脑突然上不了网,而且ping网关可以通
- PPT素材不够用,这5个网站帮你解决
热门文章
- 卫星ku波段为何优先使用垂直极化波
- 数据的聚合与分组运算
- “Building Gradle project”一直不成功的解决方案(常见于ARCORE项目导出时)
- VOC、COCO数据集类别
- 怎样用比较器实现信号的衰减和饱和_水下技术 无人水下航行器在水电站隧洞检查中的应用探讨...
- iOS——调用系统相册和相机
- 港大火星实验室最新工作:用于精确实时3D SLAM的高效概率自适应体素地图
- maven下载jar包, 反复出现lastUpdated文件
- 破解企业卓越运营难点,做好研发质量管理闭环,从“救火战役”,到“一次做对”
- vue中element国际化语言切换