(回溯) LeetCode 93. 复原IP地址

原题链接

一. 题目描述

有效 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 中的任何数字。你可以按 任何 顺序返回答案。

示例 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"]

提示:

  • 1 <= s.length <= 20
  • s 仅由数字组成

二. 解题思路

        IP地址相信大家十分熟悉了吧,合法的IP地址就是:(1)在IP之内除了数字不存在其他字母或者字符;(2)每两个点号的之间的数字不能以0开头(0除外);(3)每两个点号的之间的数字不能超过255。

1. 上面提到的三个判断是否合法的条件,第一个题目中明确说只有数字组成,所以只需要考虑后面两个条件即可,我们这里通过一个isvalid 函数判断是否合法,具体写法在下面的代码中有,这里不做多的赘述。

2. 又到了我们熟悉的环节,第一,确定递归条件:在这里我们首先需要传入字符串s ,再有就是切割位置startindex ,还有一个就是加入的分割点的点数pointnum,至于这个对后面的判断递归终止条件有作用。

3. 第二,递归终止条件:上面说到有个pointnum ,这个就是判断是否退出递归的必要条件,IP地址中间的点数想必大家都很清除,有三个,所以当我们判断如果pointnum == 3 的时候,就可以退出递归了,不过在退出递归之前要收集结果,在收集结果之前也必须做一步判断,因为在单层递归的时候都是对切割位置前面的进行合法性判断,在最后一次切割之后,字符串末尾还有几位需要进行合法性判断,在判断合法之后就可以将其收集了。

4. 第三,单层递归:从startindex 位置开始,每一层循环判断一下切割是否合法,如果合法,就在其后面加一位点号,再将pointnum 加1,再进行递归,以往我们递归的时候会从第i + 1 位开始,但是由于刚才在字符串中添加了点号,所以就得后移一位,从i + 2 ,开始递归。

5. 第四,回溯:在递归返回之后,需要将之前修改的值复原,方便下一层的循环递归。

话不多说!!!上代码!!

三. 代码

class Solution {
public:vector<string> res;                      // 收集结果 bool isvalid(string s, int l, int r){   // 判断切割的子串是否合法if(l > r) return false;if(s[l] == '0' && l != r) return false;int num = 0;for(int i = l; i <= r; i++){num = num * 10 + (s[i] - '0');if(num < 0 || num > 255) return false;}return true;}void back(string s, int startindex, int pointnum){if(pointnum == 3){if(isvalid(s, startindex, s.size() - 1)){       // 需要判断切割之后结尾的几位是否合法res.push_back(s);}return;}for(int i = startindex; i < s.size(); i++){if(isvalid(s, startindex, i)){s.insert(s.begin() + i + 1, '.');pointnum++;back(s, i + 2, pointnum);       // 因为合法之后会添加一个点号作为分割,所以得从i + 2 开始pointnum--;s.erase(s.begin() + i + 1);}else break;                        // 如果当前切割的位置不合法,后面就没有必要再判断了,必定不合法}}vector<string> restoreIpAddresses(string s) {back(s, 0, 0);return res;}
};

四. 总结

本题相较于之前的题目会有一些难以理解,但是多思考就能懂了,所以大家一定要坚持,没有什么学不会,只要你肯吃苦,就一定有吃不完的苦!说错了,报意思,一定会成功的!!加油!!

时间复杂度:O(N^2);

空间复杂度:O(N)。

喜欢的话给个关注吧!!

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

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

相关文章

【C++高阶】:特殊类设计和四种类型转换

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

Java二十三种设计模式-策略模式(13/23)

策略模式&#xff1a;灵活算法的替换与扩展 引言 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了算法族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;此模式让算法的变化独立于使用算法的客户。 基础…

C#小结:如何在VS2022中使用菜单栏中的Git管理代码

目录 第一部分&#xff1a;基础操作 第一步&#xff0c;登录官网&#xff0c;设置好邮箱&#xff0c;然后右上角新建仓库 第二步&#xff0c;提交代码到远程仓库中 第三步&#xff0c;查看和比对自己修改的内容 第四步&#xff0c;查看该项目所有提交历史记录 第五步&…

嵌入式人工智能(OpenCV-基于树莓派的人脸识别与入侵检测)

1、人脸识别 人脸识别是一种技术&#xff0c;通过检测、跟踪和识别人脸上的关键特征&#xff0c;以确认人脸的身份。它通常用于安保系统、身份验证、社交媒体和人机交互等领域。 人脸识别技术的基本原理是先通过图像处理和计算机视觉算法&#xff0c;提取人脸的特征点和特征描…

【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点

Pre-trained Language Models及其各种微调模型的实现细节和特点 1. Pre-trained Language Models2. semi-supervised Learning3. zero-shot4. Parameter-Efficient Fine-Tuning4.1 含义&#xff1a;4.2 实现方式&#xff1a; 5. LoRA5.1 LoRA 的主要特点&#xff1a;5.2 LoRA 的…

Pytorch人体姿态骨架生成图像

ControlNet是一个稳定扩散模型&#xff0c;可以复制构图和人体姿势。ControlNet解决了生成想要的确切姿势困难的问题。 Human Pose使用OpenPose检测关键点&#xff0c;如头部、肩膀、手的位置等。它适用于复制人类姿势&#xff0c;但不适用于其他细节&#xff0c;如服装、发型和…

Linux中apache服务安装与mysql安装

目录 一、apache安装 二、MySQL安装 一、apache安装 准备环境&#xff1a;一台虚拟机、三个安装包&#xff08;apr-1.6.2.tar.gz、apr-util-1.6.0.tar.gz、httpd-2.4.29.tar.bz2) 安装过程&#xff1a; tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf http…

Burp Suite的使用和文件上传漏洞靶场试验

第一步&#xff1a;分析如何利用漏洞&#xff0c;通过对代码的查阅发现&#xff0c;代码的逻辑是先上传后删除&#xff0c;意味着&#xff0c;我可以利用webshell.php文件在上传到删除之间的间隙&#xff0c;执行webshell.php的代码&#xff0c;给上级目录创建一个shell.php木马…

IDEA右键新建时没有Java Class选项

项目场景&#xff1a; IDEA右键新建时没有Java Class选项 问题描述 IDEA右键新建时没有Java Class选项 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 例如&#xff1a;Handler 发送消息有两种方式&#xff0c;分别是 Handler.obtainMessage()和 Ha…

【扒代码】ope.py

文件目录&#xff1a; 引用方式 if not self.zero_shot: # 非零样本情况下&#xff0c;计算边界框的宽度和高度 box_hw torch.zeros(bboxes.size(0), bboxes.size(1), 2).to(bboxes.device) box_hw[:, :, 0] bboxes[:, :, 2] - bboxes[:, :, 0] # 宽度 box_hw[:, :, 1] bbox…

Docker in 100 Seconds

Docker a tool that can package software into containers that run reliably in any environment, but what is a container and why do you need one? Let’s imagine you built up an app with cobalt that runs some weird flavor of Linux. You want to share this app…

idea中好用的插件

输入法自动切换插件 自动切换输入法插件&#xff1a;Smart Input。编写代码时自动切换到英文输入法&#xff0c;注释代码自动切换为中文输入法。极大的提升我们的编码效率。 MyBatisX插件 MybatisX 是一款基于 IDEA 的快速开发插件&#xff0c;为效率而生。主要用于XML映射配…

吴恩达机器学习COURSE2 WEEK2

COURSE2 WEEK2 模型训练的细节 定义模型&#xff0c;即指定如何在给定输入特征 x x x 以及参数 w w w 和 b b b 的情况下计算输出 指定损失函数 L ( f w ⃗ , b ( x ⃗ ) , y ) L(f_{\vec w, b}(\vec x),y) L(fw ,b​(x ),y) 指定成本函数 J ( w ⃗ , b ) 1 m ∑ i 1 …

Linux系统驱动(十三)Linux内核定时器

文章目录 一、内核定时器原理二、定时器API三、使用定时器让LED灯闪烁四、使用定时器对按键进行消抖 一、内核定时器原理 内核当前时间通过jiffies获取&#xff0c;它是内核时钟节拍数&#xff0c;在linux内核启动的时候&#xff0c;jiffies开始&#xff08;按照一定频率&…

【数据结构】顺序结构实现:特殊完全二叉树(堆)+堆排序

二叉树 一.二叉树的顺序结构二.堆的概念及结构三.堆的实现1.堆的结构2.堆的初始化、销毁、打印、判空3.堆中的值交换4.堆顶元素5.堆向上调整算法&#xff1a;实现小堆的插入6.堆向下调整算法&#xff1a;实现小堆的删除7.堆的创建1.堆向上调整算法&#xff1a;建堆建堆的时间复…

CentOS 安装Redis

在 CentOS 安装 Redis 操作系统&#xff1a;centos-7.9.2009-Core 1. 更新系统 首先&#xff0c;确保你的系统是最新的&#xff1a; sudo yum update -y2. 安装 EPEL 仓库 Redis 可能不在默认的 CentOS 仓库中&#xff0c;因此你需要安装 EPEL&#xff08;Extra Packages f…

TCP详解及其在音视频传输中的应用

传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是互联网协议栈中至关重要的传输层协议。它提供了可靠、面向连接的数据传输服务&#xff0c;广泛应用于各种网络应用中。对于音视频传输&#xff0c;虽然TCP协议并不是最常用的传输协议&…

LVS实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 四、测试 1.Director服务器采用双IP桥接网络&#xff0c;一个是VPP&#xff0c;一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网…

《Advanced RAG》-11-RAG查询分类和细化

总结 文章介绍了两种高级的检索增强生成&#xff08;RAG&#xff09;技术&#xff1a;自适应 RAG 和 RQ-RAG&#xff0c;以及它们在问题复杂性学习和查询细化方面的应用和优势&#xff0c;以及如何通过小型模型的训练来提高这些技术的性能。 摘要 传统 RAG 技术虽然能够减少大型…

「MyBatis」数据库相关操作2

&#x1f387;个人主页 &#x1f387;所属专栏&#xff1a;Spring &#x1f387;欢迎点赞收藏加关注哦&#xff01; #{} 和 ${} 我们前面都是采用 #{} 对参数进行赋值&#xff0c;实际上也可以用 ${} 客户端发送⼀条 SQL 给服务器后&#xff0c;大致流程如下&#xff1a; 1.…