当前位置: 首页 > news >正文

算法通关18关 | 回溯模板如何解决复原IP问题

        18关的前几篇文章看过之后,对回溯的模板问题基本解题思路就知道了,就是固定的for循环问题,外层for循环控制横向,递归控制纵向,还要考虑撤销操作和元素是否能被重复利用问题,重复利用的情景较少,只用注意撤销就行。

1. 复原IP地址

题目

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

思路

写一个单独的方法来判断每个部分是否符合要求,

IP地址最多有4段,所以4也就是终止条件,因为需要手动添加小数点,用pointNum来表示小数点的数量,pointNum=3说明被分成4段。手动添加小数点,这要增加一个位置来存储,所以下一层递归startindex就要从i + 1,开始,其他的就是递归和回溯的过程,撤销就是将刚刚加入的分隔符删掉,并且pointNum也要减1,

代码

    public Boolean isVaild(String s, int start, int end){if (start > end){return false;}//0开头的不合法if (s.charAt(start) == '0' && start != end){return false;}int 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){return false;}}return true;}List<String> result = new ArrayList<>();public List<String> restoreIPAddress(String s){//这个是ip特性决定的if (s.length() < 4 || s.length() > 12){return result;}backTrack(s,0,0);return result;}private void backTrack(String s, int startIndex, int pointNum) {if (pointNum == 3){//小数点为3时候,分割结束,//判断第四段是否合法,合法放入resul中if (isVaild(s,startIndex,s.length() - 1)){result.add(s);}return;}for (int i = startIndex; i < s.length(); i++) {if (isVaild(s,startIndex,i)) {//后面插入小数点s = s.substring(0, i + 1) + "." + s.substring(i + 1);pointNum++;//插入小数点之后下个位置的起始字符位置i+2backTrack(s, i + 2, pointNum);pointNum--;//撤销操作s = s.substring(0, i + 1) + s.substring(i + 2);//撤销小数点}else {break;}}}

http://www.lryc.cn/news/165846.html

相关文章:

  • Layui快速入门之第五节 导航
  • 使用分支——Git Checkout
  • 【2023】数据挖掘课程设计:基于TF-IDF的文本分类
  • java.lang.NoSuchMethodError: java.lang.reflect.Field.trySetAccessible()Z
  • 如何使用SQL系列 之 如何在MySQL中使用存储过程
  • 用 Github Codespaces 免费搭建本地开发测试环境
  • PyTorch实战-实现神经网络图像分类基础Tensor最全操作详解(一)
  • 第29章_瑞萨MCU零基础入门系列教程之改进型环形缓冲区
  • 如何搭建一个react项目(详细介绍)
  • ActiveMQ用法
  • TouchGFX之缓存位图
  • 线性代数的本质(十)——矩阵分解
  • vue实现鼠标拖拽div左右移动的功能
  • 基于Python和mysql开发的商城购物管理系统分为前后端(源码+数据库+程序配置说明书+程序使用说明书)
  • MySQL内外连接、索引特性
  • 滚动条设置
  • 【AI】机器学习——感知机
  • 蓝牙遥控器在T2-U上的应用
  • 数据驱动的数字营销与消费者运营
  • Qt点亮I.MX6U开发板的一个LED
  • 网络摄像头-流媒体服务器-视频流客户端
  • Django05_反向解析
  • 基于HTML、CSS和JavaScript制作一个中秋节倒计时网页
  • 富斯I6刷10通道固件
  • vector的模拟实现 总结
  • k8s中的有状态,无状态,pv、pvc等
  • springboot+jxls复杂excel模板导出
  • 用selenium webdriver获取网站cookie后,实现免登录上网站
  • 如何使用Java进行安全测试?
  • Linux之Socket函数(详细篇)