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 地址相关推荐

  1. [LeetCode] Restore IP Addresses 复原IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  2. [LeetCode] Restore IP Addresses 复原IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  3. java实现复原IP地址,回溯算法:复原IP地址

    93.复原IP地址 题目地址:https://leetcode-cn.com/problems/restore-ip-addresses/ 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地 ...

  4. 回溯算法——复原IP地址(Leetcode 93)

    题目选自Leetcode 93.复原IP地址 由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法,对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案. 通俗来讲,就是 ...

  5. LeetCode93. 复原IP地址

    93. 复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 输入"010010" 输出["0.10.0.10","0. ...

  6. 93. 复原 IP 地址

    93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...

  7. leetcode系列-93.复原 IP 地址

    leetcode系列–第93题.复原 IP 地址 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔.例如:" ...

  8. LeetCode 第 93 题:复原IP地址(C++)

    93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...

  9. leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)

    文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...

最新文章

  1. 企业级 SpringBoot 教程 (三)SpringBoot用JdbcTemplates访问Mysql
  2. 【R】函数-字符处理函数
  3. oracle易忘函数用法(5)
  4. sqlnet.expire_time and idle_time
  5. Kernel panic -not syncing:Attempted to kill init!
  6. 你被这些网络迷题难倒过吗?
  7. 烂泥:IE6绿色中文版,支持在Win7、Win8下完美运行
  8. jQuery源码学习之五 (jQUery继承方法)
  9. 【Proteus仿真】220V转5V向单片机供电
  10. 正则匹配新闻内容案例,JS和PHP
  11. 数据库服务器操作系统升级方案,PostgreSQL 数据库跨版本升级常用方案解析
  12. 价值连城 知名深度强化学习Pieter Abbeel的采访 给机器学习 深度学习 和机器人学研究者从业者的建议
  13. 什么是configmap资源、secret资源(实战)
  14. Excel做题记录——整数规划优化模型
  15. 侠客工具盒 v5.0 build 0313 bt
  16. WPS 二维表格匹配方式(利用VLOOKUP+IF/SWITCH多条件查询)
  17. kalibr fov畸变模型
  18. 机器视觉中的光源选型及打光方案分析
  19. 电脑突然上不了网,而且ping网关可以通
  20. PPT素材不够用,这5个网站帮你解决

热门文章

  1. 卫星ku波段为何优先使用垂直极化波
  2. 数据的聚合与分组运算
  3. “Building Gradle project”一直不成功的解决方案(常见于ARCORE项目导出时)
  4. VOC、COCO数据集类别
  5. 怎样用比较器实现信号的衰减和饱和_水下技术 无人水下航行器在水电站隧洞检查中的应用探讨...
  6. iOS——调用系统相册和相机
  7. 港大火星实验室最新工作:用于精确实时3D SLAM的高效概率自适应体素地图
  8. maven下载jar包, 反复出现lastUpdated文件
  9. 破解企业卓越运营难点,做好研发质量管理闭环,从“救火战役”,到“一次做对”
  10. vue中element国际化语言切换