回溯算法-----复原IP地址(Java版本)
题目
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。示例:输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
解决方法
//回溯用LinkedList<String> linkedList = new LinkedList<>();//保存结果用List<String> result = new ArrayList<>();public List<String> restoreIpAddresses(String s) {dfs(s,0,0);return result;}public void dfs(String string,int dort,int curIndex){//判断点的个数 如果是3个点 都满足 那么就是真的ip地址 // 回溯 结束的条件 就是具备三个点//对于每一个点 各种情况 如果说其中有一个后续直接不满足 回溯//如果当前的index 超过了字符串的长度 返回if (curIndex >= string.length()) {return;}//如果当前的字符串是0 那么后面就不能增加字符串了,因为不能出现01.01.01.01 这种int max = string.charAt(curIndex) == '0' ? 1 : 3;for (int i = 1; i <= max; i++) {//保证不要超过整个字符串大小if (curIndex + i > string.length()) {continue;}//截取字符串String substring = string.substring(curIndex, curIndex + i);//如果是合理的字符串 (0<x <255)if (!isInvalidate(substring)) {continue;}//增加linkedList.add(substring);//如果是第三个点 那么就是结束的时候了if (dort == 3) {//如果当前的长度是整个数组的长度 那么就是结束的时候了if (curIndex + substring.length() == string.length()) {//添加结果String join = String.join(".", linkedList);result.add(join);}}else {//如果不是最后一个点 那么添加下一个点dfs(string,dort + 1,curIndex + substring.length());}//回溯linkedList.pollLast();}}public boolean isInvalidate(String string){return string.length() <= 3 && Integer.parseInt(string) <= 255;}
题解参考:
https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html#%E5%9B%9E%E6%BA%AF%E4%B8%89%E9%83%A8%E6%9B%B2
第二次又刷到 尽然没有做出来:
public List<String> restoreIpAddresses(String s) {List<String> result = new ArrayList<>();backTrace(s,0,0,result);return result;}public void backTrace(String s,int curIndex,int count,List<String> result){if (count == 3){if (isValiad(s,curIndex,s.length()-1)){result.add(s);}return;}for (int i = curIndex ; i < s.length(); i++) {if (isValiad(s,curIndex,i)){s = s.substring(0,i+1) + "." + s.substring(i + 1);backTrace(s,i+2,count+1,result);s = s.substring(0,i+1) + s.substring(i + 2);}else {break;}}}public boolean isValiad(String s , int start ,int end){if (start > end) {return false;}if (end - start > 3){return false;}if (s.charAt(start) == '0' && start != end) {return false;}//<255int num = 0;for (int i = start; i <= end; i++) {if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法return false;}num = num * 10 + (s.charAt(i) - '0');if (num > 255) { // 如果⼤于255了不合法return false;}}return true;}
回溯算法-----复原IP地址(Java版本)相关推荐
- 回溯算法——复原IP地址(Leetcode 93)
题目选自Leetcode 93.复原IP地址 由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法,对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案. 通俗来讲,就是 ...
- java实现复原IP地址,回溯算法:复原IP地址
93.复原IP地址 题目地址:https://leetcode-cn.com/problems/restore-ip-addresses/ 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地 ...
- LeetCode 93. 复原 IP 地址【字符串,回溯算法】
93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...
- 93. 复原 IP 地址
93. 复原 IP 地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔. 例如:"0.1.2.201" ...
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- 007.复原 IP 地址
1.题目链接: 93. 复原 IP 地址 2.解题思路: 2.1.题目要求: 给定一串只包含数字的字符串s,返回所有让 s 构成 有效IP地址 的数字组合. 有IP地址: 4个 [0,255] 范围内 ...
- LeetCode 第 93 题:复原IP地址(C++)
93. 复原IP地址 - 力扣(LeetCode) 最开始的思路是对字符串进行三次切割,每次从左边切一块下来(最多切3位数). 那么我们现在有三个切割点(下标) i, j, k,它们应该满足: n=s ...
- leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)
文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...
- [LeetCode] Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
最新文章
- Python学习的十个阶段,学完大成,对应一下看看你自己在哪个阶段
- Base:一种 Acid 的替代方案
- 听说你想去大厂看妹子,带你看看美团后端开发实习岗详细面经
- centos上安装supervisor来管理dotnetcore等应用程序
- Struts2框架--学习笔记(上):搭建struts2工程、struts2基本概念、struts2对页面数据的操作
- boost::overwrite相关的测试程序
- java数据源是什么_《java数据源—连接池》
- linux数据包注释,关于 linux中TCP数据包(SKB)序列号的小笔记
- leetCode —— 1200.最小绝对差
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响(二)
- python 打包_Python 打包指南
- xcode 4.5中设置程序名字多语言
- php转义还原,PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例_PHP
- c语言最小公倍数最简单求法,c语言最小公倍数与最大公约数的求法集锦
- 【技术分享】Windows10下安装Nvidia显卡驱动及cuda和cudnn
- 自动读取短信中心号码
- 联通数据能力开放平台介绍
- 利用Web查询文件(.iqy)有效钓鱼
- potplayer默认专辑加载同一文件夹下所有视频,只读取一部分视频,加载视频目录不完整
- 浏览器上享受《速度与激情》,开发者花 16 个月用 JavaScript 造了一款驾驶游戏,水里也能开车!
热门文章
- linux网络配置总结,linux中的网络配置命令的总结
- python取特定年份的数据_python,_怎样用python提取不同股票csv里特定时间段的数据,python - phpStudy...
- python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...
- 14、计算机图形学——whited-style光线追踪
- 网口相机设置自动复位时间(心跳时间)
- MFC消息响应函数OnPaint
- linux 负数_linux内核提权系列教程(2):任意地址读写到提权的4种方法
- 判断是不是一个数组?
- 用无人机打点作画,密集恐惧症患者慎入!
- js:如何在循环异步请求的每次返回中添加想要的值