leetcode复原IP地址
复原IP地址
题目:有效 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 中的任何数字。你可以按 任何 顺序返回答案。思路:寻找所有的可能,很容易想到使用回溯法,深搜加剪枝。关键在于控制深搜的入口与出口,并合理的剪枝(考虑可能的情况)。在采用回溯法时,我们习惯使用画图,将过程画成一颗数,这里可以分为四段,因此递归树最多有四层。如下图:
我们用递归函数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 地址,我们将其加入答案。在其它的时刻,如果提前遍历完了整个字符串,那么我们需要结束搜索,回溯到上一步。
代码:
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地址相关推荐
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- 回溯算法——复原IP地址(Leetcode 93)
题目选自Leetcode 93.复原IP地址 由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法,对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案. 通俗来讲,就是 ...
- leetcode系列-93.复原 IP 地址
leetcode系列–第93题.复原 IP 地址 题目描述:有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔.例如:" ...
- LeetCode 第 93 题:复原IP地址(C++)
93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)
文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...
- LeetCode 93. 复原 IP 地址【字符串,回溯算法】
93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...
- java实现复原IP地址,回溯算法:复原IP地址
93.复原IP地址 题目地址:https://leetcode-cn.com/problems/restore-ip-addresses/ 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地 ...
- LeetCode93. 复原IP地址
93. 复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 输入"010010" 输出["0.10.0.10","0. ...
- 93. 复原 IP 地址
93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...
最新文章
- MySQL学习(十一)
- 数据持久化 技术比较
- 基础知识:什么是ASP.NET Razor页面?
- 基于Object.defineProperty实现双向数据绑定
- 探索Bioconductor数据包
- An Algorithm Summary of Programming Collective Intelligence (1)
- 1716. 计算力扣银行的钱
- STM32F103 - CubeMX 的使用实例详细(04.5)- STM32F103的 - 定时器设定详细解释 - 定时器相关的HAL接口函数 - 定时器的中断
- Sublime Text 文件乱码
- python工资一般多少p-预测python数据分析师的工资
- python2.7 内置ConfigParser支持Unicode读写
- 基于MSP430f5529的红外循迹小车
- 小程序 云开发 数据库操作
- MySQL-InnoDB锁
- 嵌入式驱动程序(5-5)点灯大师⑤之TM1668
- 《惢客创业日记》2018.11.23(周五) 郭鑫年,你是不是死了?
- 编译Linux 内核
- python整数拆分dp算法_整数拆分问题的四种解法【转载】
- python基础编程:基于Python对象引用、可变性和垃圾回收详解
- wifi分析仪怎么看哪个信道好_无线路由器选择哪个信道上网更快以获得最佳WIFI体验...