回溯算法06-复原IP地址(Java/分割字符串)

6.复原IP地址

  • 题目描述

有效 IP 地址 正好由四个整数(每个整数位于 0255 之间组成,且不能含有前导 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 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"
输出:["0.0.0.0"]

示例 3:

输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
  • 思路分析
本题本质上是一个切割字符串的问题,并且要求切割的子串满足一定的规律,我们仍然可以用回溯算法去解决此类问题。这一我们上一题目分割回文子串方法很相近,只是多了一步在小数点的增添,下面我们以一个例子来分析一下本题的解法

image-20240307121445277

1.初始化:
使用StringBuilder来构建当前的IPv4地址段(称为path)。
使用ArrayList来保存所有找到的有效IPv4地址(称为result)。2.回溯函数 backtrack(String s, int pointSum):
s是当前还未处理的字符串部分。
pointSum表示当前已经添加了多少个点(即,已经找到了多少个数字段)。
每次通过检验未处理的字符串部分来进行递归3.终止条件:
当pointSum等于3时,意味着我们已经找到了三个点,即四个数字段。此时,我们需要检查剩余的字符串s是否有效,并且长度不为0(因为每个数字段至少包含一个字符)。如果满足条件,则将当前path中的字符串添加到result中,并回退状态。4.回溯搜索:
在每次回溯调用中,我们遍历字符串s的所有可能的前缀,检查它们是否是有效的数字段(通过isValid函数)。
如果找到有效的数字段,我们将其添加到path中,并添加一个点。
然后,我们对剩余的字符串s的剩余部分进行递归回溯调用。
在递归返回后,我们需要回退状态,即从path中删除之前添加的数字段和点,并将pointSum减1,以便尝试其他可能的组合。
  • Java代码实现
StringBuilder path = new StringBuilder();List<String> result = new ArrayList<>();public List<String> restoreIpAddresses(String s) {backtrack(s, 0);return result;}private void backtrack(String s, int pointSum) {if (pointSum == 3) {if (!s.equals("") && isValid(s)) {path.append(s);result.add(new String(path));path.delete(path.length() - s.length(), path.length());}return;}for (int i = 0; i < s.length(); i++) {String before = s.substring(0, i + 1);if (isValid(before)) {path.append(before);path.append(".");pointSum++;String after = s.substring(i + 1);backtrack(after, pointSum);path.delete(path.length() - before.length() - 1, path.length());pointSum--;}}}private Boolean isValid(String s) {if (s.length() != 1 && s.charAt(0) == '0') { // 0开头的数字不合法return false;}int num = 0;for (int i = 0; i < s.length(); i++) {num = num * 10 + (s.charAt(i) - '0');if (num > 255) { // 如果⼤于255了不合法return false;}}return true;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/517945.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP PP学习笔记07 - 简单BOM,派生BOM,多重BOM,批量修改工具 CEWB

上一章讲了BOM的操作。 SAP PP学习笔记06 - BOM操作&#xff08;BOM 展开&#xff0c;BOM 使用先一览&#xff0c;BOM比较&#xff0c;批量更改BOM&#xff09;-CSDN博客 本章延续上一章&#xff0c;继续讲BOM操作。 主要讲 派生BOM&#xff0c;多重BOM&#xff0c;以及BOM批…

【python】对角线遍历

python系列文章目录 【python】基于cv2提取图片上的文本内容 【python】简单作图 【python】数组字符串等实用 【python】sort与sorted排序使用 【python】对角线遍历 python系列文章目录说明1.分析2.注意事项2.1 遍历2.2 区间2.3 顺序 3.代码实现 说明 给你一个大小为 m x n…

C--8--解决因配置文件中字符编码不一致问题导致的错误

1、介绍&#xff1a; ASCII 1个字节1个文字 ANSI 2个字节1个文字 UNICODE 3或4个甚至更多字节1个文字 ASCII、ANSI、UNICODE这三种压缩后&#xff0c;变为UTF-8、UTF-16、UTF-32。 ASCII、ANSI、UNICODE 是字符编码&#xff0c;即给全世界每…

C语言题目练习

目录 前言 1、转置矩阵 1.1 题目 描述 输入描述&#xff1a; 输出描述&#xff1a; 1.2解题 分析&#xff1a; 程序&#xff1a; 2、KiKi判断上三角矩阵 2.1 题目 描述 输入描述&#xff1a; 输出描述&#xff1a; 2.2 解题 分析&#xff1a; 程序&#xff1a; 3、…

微信抽奖小程序制作步骤是什么_轻松点燃营销热潮

微信抽奖小程序&#xff0c;轻松点燃营销热潮&#xff01; 在数字化营销的时代&#xff0c;如何吸引用户眼球、提升品牌知名度&#xff0c;成为了每一个企业都必须面对的问题。而微信抽奖小程序&#xff0c;正是一个能够迅速点燃营销热潮的利器。那么&#xff0c;如何制作一款…

NextJs教程系列(三):路由layout

可复用的布局 Next.js的layout是一个可复用的布局&#xff0c;不同的子页面可以共享布局容器&#xff0c;页面跳转时&#xff0c;layout容器不会重新渲染。 children props export default function RootLayout({ children }) {return (<html lang"en"><…

okHttp MediaType MIME格式详解

一、介绍 我们在做数据上传时&#xff0c;经常会用到Okhttp的开源库&#xff0c;okhttp开源库也遵循html提交的MIME数据格式。 所以我们经常会看到applicaiton/json这样的格式在传。 但是如果涉及到其他文件等就需要详细的数据格式&#xff0c;否则服务端无法解析 二、okHt…

mysql-DBA(1)-数据库备份恢复-导入导出-日志解释

1.备份类型 log: hdd data :ssd 2.数据库工具 3.逻辑备份和物理备份 &#xff0c;备份和导出都慢&#xff0c;缓冲池有污染。 逻辑备份&#xff1a;把所有的命令转换成sql语句。 修改配置文件&#xff1a; 3.1MySQLDUMP -A 备份所有 -B 备份哪个数据库 --master-data1 同步 …

Flyway 9.22.3 + springboot3 + MySQL8.0+,简单使用

文章目录 flyway的依赖配置ieda 启动&#xff01;&#xff01;&#xff01; 关于这篇文章主要是自己在使用flyway时遇到的一些问题以及最终的解决方法 当然包括所有的配置&#xff0c;主要目的是记录一下防止下次使用的时候忘记 flyway的依赖 这里 springboot 3 具体版本不再描…

电脑主机弄丢后赔偿却还收150元费用?

“电脑主机丢失后&#xff0c;我被收取了150元的赔偿费。” 22日&#xff0c;家住临沂市沂水县龙家泉镇的吴女士拨打热线电话反映&#xff0c;家里电脑主机出现问题&#xff0c;她把电脑放在镇上的一家店里。 我去电脑维修店修好了&#xff0c;对方丢了&#xff0c;但他们还是收…

美国国家安全局(NSA)和美国政府将Delphi/Object Pascal列为推荐政府机构和企业使用的内存安全编程语言

上周&#xff0c;美国政府发布了《回到构建块&#xff1a;通往安全和可衡量软件的道路》的报告。本报告是美国网络安全战略的一部分&#xff0c;重点关注多个领域&#xff0c;包括内存安全漏洞和质量指标。 许多在线杂志都对这份报告发表了评论&#xff0c;这些杂志强调了对 C…

raylib库在CodeBlocks上的配置

raylib下载 raylib | A simple and easy-to-use library to enjoy videogames programming CodeBlocks