复原IP地址

  1. 题目:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。

    例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
    给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

  2. 思路:寻找所有的可能,很容易想到使用回溯法深搜加剪枝。关键在于控制深搜的入口与出口,并合理的剪枝(考虑可能的情况)。在采用回溯法时,我们习惯使用画图,将过程画成一颗数,这里可以分为四段,因此递归树最多有四层。如下图:

    我们用递归函数dfs(segId,segStart) 表示我们正在从 [segStart] 的位置开始,搜索 IP 地址中的第 segId 段,其中 segId∈{0,1,2,3}。由于 IP 地址的每一段必须是 [0, 255]中的整数,因此我们从segStart 开始,从小到大依次枚举当前这一段 IP 地址的结束位置 segEnd。如果满足要求,就递归地进行下一段搜索,调用递归函数dfs(segId+1,segEnd+1)。

    特别地,由于 IP 地址的每一段不能有前导零,因此如果 [segStart] 等于字符 0,那么 IP 地址的第 segId 段只能为 0,需要作为特殊情况进行考虑。

    在搜索的过程中,如果我们已经得到了全部的 4段 IP 地址(即 \segId=4),并且遍历完了整个字符串(即segStart=∣s∣,其中∣s∣ 表示字符串 s 的长度),那么就复原出了一种满足题目要求的 IP 地址,我们将其加入答案。在其它的时刻,如果提前遍历完了整个字符串,那么我们需要结束搜索,回溯到上一步

  3. 代码:

    class Solution {// 回溯 + 剪枝static final int SEG_COUNT = 4;List<String> ans = new ArrayList<String>();int[] segments = new int[SEG_COUNT];public List<String> restoreIpAddresses(String s) {dfs(s, 0, 0);return ans;}public void dfs(String s, int segId, int segStart) {// 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案if (segId == SEG_COUNT) {if (segStart == s.length()) {StringBuffer ipAddr = new StringBuffer();for (int i = 0; i < SEG_COUNT; ++i) {ipAddr.append(segments[i]);if (i != SEG_COUNT - 1) {ipAddr.append('.');}}ans.add(ipAddr.toString());}return;}// 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯if (segStart == s.length()) {return;}// 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0if (s.charAt(segStart) == '0') {segments[segId] = 0;dfs(s, segId + 1, segStart + 1);}// 一般情况,枚举每一种可能性并递归int addr = 0;for (int segEnd = segStart; segEnd < s.length(); ++segEnd) {addr = addr * 10 + (s.charAt(segEnd) - '0');if (addr > 0 && addr <= 0xFF) {segments[segId] = addr;dfs(s, segId + 1, segEnd + 1);} else {break;}}}
    }
    

leetcode复原IP地址相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. LeetCode 93. 复原 IP 地址【字符串,回溯算法】

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

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

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

  9. LeetCode93. 复原IP地址

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

  10. 93. 复原 IP 地址

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

最新文章

  1. MySQL学习(十一)
  2. 数据持久化 技术比较
  3. 基础知识:什么是ASP.NET Razor页面?
  4. 基于Object.defineProperty实现双向数据绑定
  5. 探索Bioconductor数据包
  6. An Algorithm Summary of Programming Collective Intelligence (1)
  7. 1716. 计算力扣银行的钱
  8. STM32F103 - CubeMX 的使用实例详细(04.5)- STM32F103的 - 定时器设定详细解释 - 定时器相关的HAL接口函数 - 定时器的中断
  9. Sublime Text 文件乱码
  10. python工资一般多少p-预测python数据分析师的工资
  11. python2.7 内置ConfigParser支持Unicode读写
  12. 基于MSP430f5529的红外循迹小车
  13. 小程序 云开发 数据库操作
  14. MySQL-InnoDB锁
  15. 嵌入式驱动程序(5-5)点灯大师⑤之TM1668
  16. 《惢客创业日记》2018.11.23(周五) 郭鑫年,你是不是死了?
  17. 编译Linux 内核
  18. python整数拆分dp算法_整数拆分问题的四种解法【转载】
  19. python基础编程:基于Python对象引用、可变性和垃圾回收详解
  20. wifi分析仪怎么看哪个信道好_无线路由器选择哪个信道上网更快以获得最佳WIFI体验...

热门文章

  1. 日程表模板html,excel日程表模板(每日工作时间表模板)
  2. mcgs 施耐德tm218 变频器cv3100通过modbus连接控制
  3. 秒杀系统 后端设计方案
  4. 2018年下半年软件设计师下午真题及答案解析
  5. 潮流短视频必备——PR赛博朋克效果视频转场快速过渡模板
  6. Win10系统中破解软件的注册机被自动删除的解决方法
  7. linux步进电机实验程序,基于嵌入式Linux的步进电机驱动程序设计
  8. 微信小程序 服务通知之订阅消息授权公共方法
  9. 抖音快手短视频去水印小程序解析接口API开发文档
  10. 计算机动画类型,FW动画类型及制作详解 -电脑资料