题目描述(中等难度)

给一个字符串,输出所有的可能的 ip 地址,注意一下,01.1.001.1 类似这种 0 开头的是非法字符串。

解法一 回溯 递归 DFS

很类似于刚做过的 91 题,对字符串进行划分。这个其实也是划分,划分的次数已经确定了,那就是分为 4 部分。那么就直接用回溯的思想,第一部分可能是 1 位数,然后进入递归。第一部分可能是 2 位数,然后进入递归。第一部分可能是 3 位数,然后进入递归。很好理解,直接看代码理解吧。

public List restoreIpAddresses(String s) {

List ans = new ArrayList<>(); //保存最终的所有结果

getAns(s, 0, new StringBuilder(), ans, 0);

return ans;

}

/**

* @param: start 字符串开始部分

* @param: temp 已经划分的部分

* @param: ans 保存所有的解

* @param: count 当前已经加入了几部分

*/

private void getAns(String s, int start, StringBuilder temp, List ans, int count) {

//如果剩余的长度大于剩下的部分都取 3 位数的长度,那么直接结束

//例如 s = 121231312312, length = 12

//当前 start = 1,count 等于 1

//剩余字符串长度 11,剩余部分 4 - count = 3 部分,最多 3 * 3 是 9

//所以一定是非法的,直接结束

if (s.length() - start > 3 * (4 - count)) {

return;

}

//当前刚好到达了末尾

if (start == s.length()) {

//当前刚好是 4 部分,将结果加入

if (count == 4) {

ans.add(new String(temp.substring(0, temp.length() - 1)));

}

return;

}

//当前超过末位,或者已经到达了 4 部分结束掉

if (start > s.length() || count == 4) {

return;

}

//保存的当前的解

StringBuilder before = new StringBuilder(temp);

//加入 1 位数

temp.append(s.charAt(start) + "" + '.');

getAns(s, start + 1, temp, ans, count + 1);

//如果开头是 0,直接结束

if (s.charAt(start) == '0')

return;

//加入 2 位数

if (start + 1 < s.length()) {

temp = new StringBuilder(before);//恢复为之前的解

temp.append(s.substring(start, start + 2) + "" + '.');

getAns(s, start + 2, temp, ans, count + 1);

}

//加入 3 位数

if (start + 2 < s.length()) {

temp = new StringBuilder(before);

int num = Integer.parseInt(s.substring(start, start + 3));

if (num >= 0 && num <= 255) {

temp.append(s.substring(start, start + 3) + "" + '.');

getAns(s, start + 3, temp, ans, count + 1);

}

}

}

解法二 迭代

参考这里,相当暴力直接。因为我们知道了,需要划分为 4 部分,所以我们直接用利用三个指针将字符串强行分为四部分,遍历所有的划分,然后选取合法的解。

public List restoreIpAddresses(String s) {

List res = new ArrayList();

int len = s.length();

//i < 4 保证第一部分不超过 3 位数

//i < len - 2 保证剩余的字符串还能分成 3 部分

for(int i = 1; i<4 && i

for(int j = i+1; j

for(int k = j+1; k

//保存四部分的字符串

String s1 = s.substring(0,i), s2 = s.substring(i,j), s3 = s.substring(j,k), s4 = s.substring(k,len);

//判断是否合法

if(isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4)){

res.add(s1+"."+s2+"."+s3+"."+s4);

}

}

}

}

return res;

}

public boolean isValid(String s){

if(s.length()>3 || s.length()==0 || (s.charAt(0)=='0' && s.length()>1) || Integer.parseInt(s)>255)

return false;

return true;

}

时间复杂度:如果不考虑我们调用的内部函数,Integer.parseInt,s.substring,那么就是 O(1)。因为每一层循环最多遍历 4 次。考虑的话每次调用的时间复杂度是 O(n),常数次调用,所以是 O(n)。

空间复杂度:O(1)。

回溯或者说深度优先遍历,经常遇到了。但是解法二的暴力方法竟然通过了,有些意外。另外分享下 discuss 里有趣的评论,哈哈哈哈。

java实现复原IP地址_LeetCode 力扣 93. 复原IP地址相关推荐

  1. 力扣93 - 复原IP地址【回溯算法】

    回溯算法解决字符串分割问题 一.题目分析 题目描述 思路分析 二.代码的细究与详解 回溯三部曲 三.相似题目 四.总结与提炼 一.题目分析 原题链接 题目描述 有效 IP 地址 正好由四个整数(每个整 ...

  2. 力扣93. 复原 IP 地址(JavaScript)

    var restoreIpAddresses = function(s) { let arr=[]let p=[]const dd=function(index){//其中一个组合的长度大于4,错if ...

  3. java邮箱验证正则表达式_LeetCode 力扣官方题解 | 468.验证 IP 地址

    点击上方蓝字设为星标 下面开始今天的学习-力扣 468. 验证 IP 地址(点击文末阅读原文查看题目)题目描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址. IPv4 地 ...

  4. int类型年月怎么区间查询_LeetCode 力扣官方题解 | 57.插入区间

    点击上方蓝字设为星标 下面开始今天的学习-力扣  57. 插入区间(点击文末阅读原文查看题目)题目描述给出一个无重叠的 ,按照区间起始端点排序的区间列表.在列表中插入一个新的区间,你需要确保列表中的区 ...

  5. 将矩阵转为一行_LeetCode 力扣官方题解 | 861. 翻转矩阵后的得分

    点击上方蓝字设为星标 下面开始今天的学习- 力扣  861. 翻转矩阵后的得分(点击文末阅读原文查看题目)题目描述有一个二维矩阵 A 其中每个元素的值为 0 或 1 .移动是指选择任一行或列,并转换该 ...

  6. leetcode c++未初始化_LeetCode 力扣官方题解 | 538. 把二叉搜索树转换为累加树

    力扣 538. 把二叉搜索树转换为累加树(点击查看题目) 力扣​leetcode-cn.com 题目描述 给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater ...

  7. ip复原Java,力扣:复原IP地址

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...

  8. 力扣Java解数独_LeetCode 力扣 37. 解数独

    题目描述(困难难度) 给定一个数独棋盘,输出它的一个解. 解法一 回溯法 从上到下,从左到右遍历每个空位置.在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后 ...

  9. Java基础知识总结(刷力扣必备)

    目录 零.前言 0.1Java的输入 0.2 Java的输出 一.数组Array和动态数组ArrayList 1.1有关数组的Array转换和排序 1.2 有关ArrayList的用法.自定义排序 1 ...

  10. 力扣刷题记录-回溯算法相关题目

    首先介绍一下回溯算法 回溯通常在递归函数中体现,本质也是一种暴力的搜索方法,但可以解决一些用for循环暴力解决不了的问题,其应用有: 1.组合问题: 例:1 2 3 4这些数中找出组合为2的组合,有1 ...

最新文章

  1. hibernate的映射关系配置及对会话工厂的初始化。以及struts2写实例查询
  2. Java的Excel导出方案介绍
  3. 同态加法_同态的Spotify
  4. 何恺明团队最新研究:3D目标检测新框架VoteNet,两大数据集刷新最高精度
  5. mysql 生成日历表_如何在SQL中创建100年的日历表
  6. 计科1501韩猛实验8
  7. cesium 加载科技感
  8. 波形分析--SPI数据
  9. MYSQL基础:mysql客户端工具
  10. kingbase 修改数据库密码
  11. SecureCRT 8.5下载安装破解
  12. 云加数支撑商业地产转型——无止境的商业想象力测试
  13. 程序员月薪25000,很可能会掉进这个陷进了!
  14. 容器技术解决了什么问题?有何优缺点?
  15. 教你把四十个QQ个人资料小图标全点亮
  16. 携程PMO--小罗说敏捷之WIP限制在制品
  17. GhostNet代码解析
  18. 没去现场?一文 Get 云栖大会「移动专场」精华内容~含PPT下载
  19. mysql8.0Access denied for user 'root'@'' (using password: YES)
  20. Python在基金定投上的验证

热门文章

  1. [转]Go语言中的make和new
  2. poj 2442 Sequence
  3. nginx + tomcat配置负载均衡
  4. 2016保持谦卑,继续前行
  5. 使用java语言实现将10进制转化为2进制
  6. Unreal Engine 开篇
  7. iOS项目转移到自动引用计数
  8. 通过JS改变框架的src
  9. Managing Configuration Data Programmatically in ASP.NET 2.0
  10. Pascal VOC Challenge