算法:回溯十四 Restore IP Addresses数字字符串还原为IP地址(2种解法)
题目
地址: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回溯算法
思路解析:
- IP分为4个部分,每个部分的范围为
[0, 255]
. 所以每个部分的判断逻辑分为如果第一位是0,那么长度只能为1;如果每个部分长度等于3,则校验数据不大于255.if ((part.startsWith("0") && part.length() > 1) || (i == 3 && Integer.valueOf(part) > 255))
- 每部分的长度范围为
[1, 3]
, 所以每个部分都有这个范围的循环。 - 合格终止条件,如果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);}}
}
顺序遍历解法
思路解析:
- 挨个部分组装数据,并且每个部分的起点就是上一部分的终点;
- 验证每个部分是否符合规则,如果都符合,则添加到结果列表中。
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种解法)相关推荐
- 七十四、Python | Leetcode数字系列(下篇)
@Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
- 国科大学习资料--人工智能原理与算法-第十四次作业解析(学长整理)
国科大学习资料–人工智能原理与算法-第十四次作业解析(张文生老师主讲)
- 14_JavaScript数据结构与算法(十四)图
JavaScript 数据结构与算法(十四)图 图的概念 在计算机程序设计中,图也是一种非常常见的数据结构,图论其实是一个非常大的话题,在数学上起源于哥尼斯堡七桥问题. 什么是图? 图是一种与树有些相 ...
- 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现
强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...
- 数字字符串转化成 IP 地址
数字字符串转化成 IP 地址 1.参考资料 https://www.nowcoder.com/practice/ce73540d47374dbe85b3125f57727e1e 2.题目要求 题目描述 ...
- fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- 斗地主AI算法——第十四章の主动出牌(3)
上一章已经排除了飞机.三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌.对牌.三牌以及单顺.双顺.三顺了. 首先说单牌.对牌.三牌.其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型 ...
- Tsukinai的第七十四个程序(输出字符串中的元音字母)
Tsukinai的第七十四个程序 写一个函数,将一个字符串中的元音字母复制到另一个字符串,然后输出. 程序的运行示例如下: 提示信息:"\n输入字符串:" 字符串中的元音字母是eo ...
- 【密码算法 之十四】非对称算法,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 ...
- 数据结构和算法二十四
剑指 Offer 45. 把数组排成最小的数 题目:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] ...
最新文章
- utf8乱码解决方案[适合tomcat部署的jsp应用]
- 【2016-05-19】一次tomcat频繁挂掉的问题定位
- VS与Win7 共舞:用户界面特权隔离
- UML-如何使用层进行设计?
- python3.8.2汉化包-Python3.8.2中文版 32/64位 官方最新版
- 国庆假期带动新能源汽车消费热潮
- @程序员,为你揭开直播技术的神秘面纱!
- NHK SHV 的 22.2 声道音频系统
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 【专栏】8086汇编语言系列教程
- 微服务 注册中心的作用_微服务-服务与注册中心
- 中学生科技节活动计算机,2018年学校科技节活动
- 电影推荐之《哈利波特与阿兹卡班的囚徒》 隐私策略(Privacy policy)
- 【论文笔记】Self-paced Contrastive Learning with Hybrid Memory for Domain Adaptive Object Re-ID
- QQ微云图标升级方法 空间免费扩容攻略
- BUGKU_WEB_never give up
- 《天道》让你觉悟的电视剧。
- RTL设计——亚稳态相关概念
- 兼莱宝分享:不想一直打工,可以做这5个冷门生意,竞争比较小,利润却很不错
- SqlServer表中添加新字段
热门文章
- php 接摄像头数据_详解一个交换机能带动多少个网络监控摄像头?
- php验证码登录博客,php教程博客
- 【转】JQuery中$.each 和$(selector).each()的区别详解
- C#读写日志文本文件
- 少年时期最后一个儿童节
- 动态规划——Palindrome Partitioning II
- 从IBM的计划中分析出中国重新相当然的错误选择吗
- 部署shop++,启动eclipse遇到内存溢出。
- java多线程--信号量Semaphore的使用
- 基于OSSIM平台下华为交换机日志收集插件的开发