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

2023-09-13 21:37:43

        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+2
                backTrack(s, i + 2, pointNum);
                pointNum--;//撤销操作
                s = s.substring(0, i + 1) + s.substring(i + 2);//撤销小数点
            }else {
                break;
            }
        }
    }

更多推荐

【Vue】el 和 data短小精湛的细节!

hello,我是小索奇,精心制作的Vue教程持续更新哈,花费了大量的时间和精力,总结拓展了很多疑难点,想要学习&巩固&避坑就一起学习叭~el与data的两种写法el共有2种写法el表达式主要用来在模板中展示数据,它可以输出简单的变量值,也可以调用方法。语法是${表达式}创建Vue实例对象的时候配置el属性先创建Vue实

python学习--定义python中的类

创建类的语法类的组成类属性实例方法静态方法类方法classStudent:#Student为类的名称(类名)由一个或多个单词组成,每个单词首字母大写,其余小写native_place='吉林'#直接写在类的变量,称为类属性def_init_(self,name,age):self.name=name#self.name

zabbix自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

1.自定义监控内容zabbix监控模板大全:www.zabbix.com/integration…监控案例1:登录人数检测需求:某公司确定已经安装好zabbix监控系统,限制某台服务器登录人数不超过3个,超过3个就发出报警信息。该服务器(192.168.73.114)已经添加至zabbix监控系统中具体步骤步骤一:在客

MyBatis高级

文章目录一、动态sql1、if2、choose...when...otherwise...3、where4、set5、foreach6、trim7、Sql片段二、分页1、分页的使用步骤1.1、导入maven依赖2、mybatis配置文件中指定方言3、java代码测试三、mybatis多表查询1、一对一2、一对多3、多对

Docker 一键安装Confluence(已支持最新版本)

Docker一键安装Confluence(已支持最新版本)本文用于Confluence在Docker的安装,仅用于记录安装方式Jira也可以参考这种方式安装,只有细微差别转载请注明来源Linux安装可参考链接Windows安装可查考链接条件允许时,请优先选择CentOS7原生安装一、查找想要的版本跟着文档走,不想换版本

23个销量最高的3D扫描仪【2023】

如果你可以3D扫描它,你就可以3D打印它。市场上3D扫描仪的种类和质量非常丰富,机器尺寸、功能和价格各异。这样的选择虽然本身是一件很棒的事情,但也会让从无用的东西中挑选出宝石成为一件苦差事。推荐:用NSDT编辑器快速搭建可编程3D场景无论你是在寻找适合学生或业余爱好者的完美入门级扫描仪、具有更好软件和工作流程的更强大的

Talk | ICCV’23 清华赵天辰:Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化

​本期为TechBeat人工智能社区第533期线上Talk!北京时间9月21日(周四)20:00,清华大学博士生—赵天辰的Talk已准时在TechBeat人工智能社区开播!他与大家分享的主题是:“Ada3D-基于动态推理的3D感知模型压缩及软硬件协同优化”,他介绍了他们提出的动态推理框架Ada3D,并进一步介绍了在硬件

Nginx服务配置及相关模块

目录一.Nginx配置文件1.1.主配置文件解析1.2.子配置文件启用二.子配置文件使用2.1.创建虚拟主机实验2.2.基于端口虚拟主机实验三.Nginx模块3.1.access模块3.2.自定义错误页面3.3.状态页开启一.Nginx配置文件1.1.主配置文件解析①yum安装主配置文件位置:/etc/nginx/ng

vue+express、gitee pm2部署轻量服务器

一、代码配置前后端接口都保持127.0.0.1:3000vue创建文件pm2.config.cjsmodule.exports={apps:[{name:'xin-web',//应用程序的名称script:'npm',//启动脚本args:'rundev',//启动脚本的参数cwd:'/home/vue/xin_web

vue基础知识十三:Vue中的$nextTick有什么作用?

一、NextTick是什么官方对其的定义在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM什么意思呢?我们可以理解成,Vue在更新DOM时是异步执行的。当数据发生变化,Vue将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,再统一进行更新举例一下Html结构{{me

深信服安全GPT 2.0升级,开启安全运营“智能驾驶”旅程

9月22日,深信服对外展示安全GPT落地成果与2.0升级能力。来自各行业权威嘉宾代表:美的集团首席信息安全官(CISO)兼软件工程院院长、欧洲科学院院士(MAE)、IEEEFellow、IETFellow、ACM杰出科学家、AAIAFellow刘向阳、北汽福田汽车股份有限公司集团信息安全部高级经理兼欧辉新能源网络安全部

热文推荐