题目

地址:https://leetcode.com/problems/restore-ip-addresses/

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

Example:

Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]

DFS回溯算法

思路解析:

  1. IP分为4个部分,每个部分的范围为[0, 255]. 所以每个部分的判断逻辑分为如果第一位是0,那么长度只能为1;如果每个部分长度等于3,则校验数据不大于255.if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255))
  2. 每部分的长度范围为[1, 3], 所以每个部分都有这个范围的循环。
  3. 合格终止条件,如果4个部分集齐,并且开始位置等于字符串的长度,则添加到结果列表。
  4. 异常终止条件,如果4个部分集齐,但是开始位置不等于字符串长度,则退出;
    或者如果4个部分未集齐,但是开始位置已经大于等于字符串长度,则退出。
package backtracking;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;// https://leetcode.com/problems/restore-ip-addresses/
public class RestoreIPAddress {public static void main(String[] args) {RestoreIPAddress obj = new RestoreIPAddress();String s = "25525511135";List<String> resultList = obj.restoreIpAddresses(s);System.out.println(Arrays.toString(resultList.toArray()));}public List<String> restoreIpAddresses(String s) {List<String> resultList = new ArrayList<String>();if (s == null || s.length() < 4) {return resultList;}// DFSdfs(resultList, s, 0, "", 0);return resultList;}private void dfs(List<String> resultList, String s, int start, String stored, int count) {//exitif (start == s.length() && count == 4) {resultList.add(stored);}if (start >= s.length() || count == 4) {return;}for (int i = 1; i < 4; i++) {if (start + i > s.length()) {break;}String part = s.substring(start, start + i);if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255)) {continue;}dfs(resultList, s, start + i, stored + part + (count == 3 ? "" : "."), count + 1);}}
}

顺序遍历解法

思路解析:

  1. 挨个部分组装数据,并且每个部分的起点就是上一部分的终点;
  2. 验证每个部分是否符合规则,如果都符合,则添加到结果列表中。
public List<String> restoreIpAddressesWithIterate(String s) {List<String> resultList = new ArrayList<String>();if (s == null || s.length() < 4) {return resultList;}int len = s.length();String splitS = ".";// iteratefor (int fisrt = 1; fisrt < 4 && fisrt < len - 2; fisrt++) {for (int second = fisrt + 1; second < fisrt + 4 && second < len - 1; second++) {for (int third = second + 1; third < second + 4 && third < len; third++) {String part1 = s.substring(0, fisrt);String part2 = s.substring(fisrt, second);String part3 = s.substring(second, third);String part4 = s.substring(third);if (valideIP(part1) && valideIP(part2) && valideIP(part3) && valideIP(part4)) {String result = part1 + splitS + part2 + splitS + part3 + splitS + part4;resultList.add(result);}}}}return resultList;
}private Boolean valideIP(String part) {if (part.length() == 0 || part.length() > 3|| (part.startsWith("0") && part.length() != 1)|| (part.length() == 3 && Integer.valueOf(part) > 255 )) {return false;}return true;
}

下载

https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/RestoreIPAddress.java

算法:回溯十四 Restore IP Addresses数字字符串还原为IP地址(2种解法)相关推荐

  1. 七十四、Python | Leetcode数字系列(下篇)

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  2. 国科大学习资料--人工智能原理与算法-第十四次作业解析(学长整理)

    国科大学习资料–人工智能原理与算法-第十四次作业解析(张文生老师主讲)

  3. 14_JavaScript数据结构与算法(十四)图

    JavaScript 数据结构与算法(十四)图 图的概念 在计算机程序设计中,图也是一种非常常见的数据结构,图论其实是一个非常大的话题,在数学上起源于哥尼斯堡七桥问题. 什么是图? 图是一种与树有些相 ...

  4. 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现

    强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...

  5. 数字字符串转化成 IP 地址

    数字字符串转化成 IP 地址 1.参考资料 https://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e 2.题目要求 题目描述 ...

  6. fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  7. 斗地主AI算法——第十四章の主动出牌(3)

    上一章已经排除了飞机.三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌.对牌.三牌以及单顺.双顺.三顺了. 首先说单牌.对牌.三牌.其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型 ...

  8. Tsukinai的第七十四个程序(输出字符串中的元音字母)

    Tsukinai的第七十四个程序 写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出. 程序的运行示例如下: 提示信息:"\n输入字符串:" 字符串中的元音字母是eo ...

  9. 【密码算法 之十四】非对称算法,ECC椭圆曲线算法 之 ECDSA、ECDH、SM2、SM9等

    文章目录 1. ECC椭圆曲线 1.1 曲线类型 1.2 曲线标准 1.3 表示方法 1.4 曲线运算 1.4.1 点加(Point Addition) 1.4.2 点乘(Point Multipli ...

  10. 数据结构和算法二十四

    剑指 Offer 45. 把数组排成最小的数 题目:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1:          输入: [10,2] ...

最新文章

  1. utf8乱码解决方案[适合tomcat部署的jsp应用]
  2. 【2016-05-19】一次tomcat频繁挂掉的问题定位
  3. VS与Win7 共舞:用户界面特权隔离
  4. UML-如何使用层进行设计?
  5. python3.8.2汉化包-Python3.8.2中文版 32/64位 官方最新版
  6. 国庆假期带动新能源汽车消费热潮
  7. @程序员,为你揭开直播技术的神秘面纱!
  8. NHK SHV 的 22.2 声道音频系统
  9. 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
  10. 【专栏】8086汇编语言系列教程
  11. 微服务 注册中心的作用_微服务-服务与注册中心
  12. 中学生科技节活动计算机,2018年学校科技节活动
  13. 电影推荐之《哈利波特与阿兹卡班的囚徒》 隐私策略(Privacy policy)
  14. 【论文笔记】Self-paced Contrastive Learning with Hybrid Memory for Domain Adaptive Object Re-ID
  15. QQ微云图标升级方法 空间免费扩容攻略
  16. BUGKU_WEB_never give up
  17. 《天道》让你觉悟的电视剧。
  18. RTL设计——亚稳态相关概念
  19. 兼莱宝分享:不想一直打工,可以做这5个冷门生意,竞争比较小,利润却很不错
  20. SqlServer表中添加新字段

热门文章

  1. php 接摄像头数据_详解一个交换机能带动多少个网络监控摄像头?
  2. php验证码登录博客,php教程博客
  3. 【转】JQuery中$.each 和$(selector).each()的区别详解
  4. C#读写日志文本文件
  5. 少年时期最后一个儿童节
  6. 动态规划——Palindrome Partitioning II
  7. 从IBM的计划中分析出中国重新相当然的错误选择吗
  8. 部署shop++,启动eclipse遇到内存溢出。
  9. java多线程--信号量Semaphore的使用
  10. 基于OSSIM平台下华为交换机日志收集插件的开发