力扣 93. 复原 IP 地址

news2024/11/26 14:38:39

题目来源:https://leetcode.cn/problems/restore-ip-addresses/description/

C++题解:递归回溯法。

  • 递归参数:因为不能重复分割,需要ind记录下一层递归分割的起始位置;还需要一个变量num,记录ip段的数量。
  • 递归终止条件:ip段的数量达到4 且 ind等于s的长度,可进行有效ip地址保存;当s剩余字符较长时,可进行提前截断。
  • 单层递归逻辑:截断的长度为1-3个字符,判断截出的字符串有效性,无效则停止回溯,有效则继续下一步的回溯,同时记得ip的回溯。
class Solution {
public:
    vector<string> res;
    string ip = "";
    bool isval(string ipseg) {  // 判断字符串有效性
        int lenipseg = ipseg.size();
        if(lenipseg == 1) return true;
        else if(lenipseg == 2){
            if(ipseg[0] == '0') return false;
            return true;
        }
        else if(lenipseg == 3){
            if(ipseg[0] == '0') return false;
            int ipsegint = (ipseg[0] - '0')*100 + (ipseg[1] - '0')*10 + ipseg[2] - '0';
            if(ipsegint <= 255) return true;
            else return false;
        }
        return false;
    }
    void backtracking(string s, int ind, int num) {
        if(ind == s.size() && num == 4) {
            res.push_back(ip);
            return;
        }
        if(num == 0 && s.size() - ind > 12) return;
        else if(num == 1 && s.size() - ind > 9) return;
        else if(num == 2 && s.size() - ind > 6) return;
        else if(num == 3 && s.size() - ind > 3) return;
        else if(num == 4 && s.size() - ind > 0) return; 
        else if(ind >= s.size() || num > 4) return;

        for(int i = ind, j = 1; j <= 3; j++){
            string ipseg = s.substr(i, j);            
            if(isval(ipseg)) {
                int lenip = ip.size(); //记录ip长度,方便回溯
                ip = ip + ipseg;
                num++;
                if(num < 4) ip = ip + ".";
                backtracking(s, i + j, num);
                ip = ip.substr(0, lenip);
                num--;
            }
            else return;
        }
        return;
    }
    vector<string> restoreIpAddresses(string s) {
        int len = s.size();
        if(len > 12) return res;
        backtracking(s, 0, 0);
        return res;
    }
};

 C++题解:思路同上,来源代码随想录

 

class Solution {
private:
    vector<string> result;// 记录结果
    // startIndex: 搜索的起始位置,pointNum:添加逗点的数量
    void backtracking(string& s, int startIndex, int pointNum) {
        if (pointNum == 3) { // 逗点数量为3时,分隔结束
            // 判断第四段子字符串是否合法,如果合法就放进result中
            if (isValid(s, startIndex, s.size() - 1)) {
                result.push_back(s);
            }
            return;
        }
        for (int i = startIndex; i < s.size(); i++) {
            if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法
                s.insert(s.begin() + i + 1 , '.');  // 在i的后面插入一个逗点
                pointNum++;
                backtracking(s, i + 2, pointNum);   // 插入逗点之后下一个子串的起始位置为i+2
                pointNum--;                         // 回溯
                s.erase(s.begin() + i + 1);         // 回溯删掉逗点
            } else break; // 不合法,直接结束本层循环
        }
    }
    // 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法
    bool isValid(const string& s, int start, int end) {
        if (start > end) {
            return false;
        }
        if (s[start] == '0' && start != end) { // 0开头的数字不合法
                return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法
                return false;
            }
            num = num * 10 + (s[i] - '0');
            if (num > 255) { // 如果大于255了不合法
                return false;
            }
        }
        return true;
    }
public:
    vector<string> restoreIpAddresses(string s) {
        result.clear();
        if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了
        backtracking(s, 0, 0);
        return result;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】第二十章:解释器模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

中国移动九天毕昇部署fastchat Ubuntu18.04+torch1.13.1+cuda11.6+python3.9

8核CPU,RAM32G 时间&#xff1a;2023年7月 项目地址:GitHub - lm-sys/FastChat: An open platform for training, serving, and evaluating large language models. Release repo for Vicuna and FastChat-T5. 体验地址:https://chat.lmsys.org/ 时间20230703&#xff0c;fas…

【Web3】Web3连接到以太坊网络(测试网、主网)

目录 什么是Web3 Web3项目连接以太坊网络 1.下载Web3 2.实例化Web3对象 3.infura 获取连接以太坊网络节点 4.添加网络节点 什么是Web3 web3.js开发文档&#xff1a;web3.js - Ethereum JavaScript API — web3.js 1.0.0 documentation web3.js 中文文档 : web3.js - 以…

【观察】技术创新+以行践言双管齐下,戴尔科技加速边缘计算落地

众所周知&#xff0c;随着混合多云的快速发展&#xff0c;来自百行千业的用户都在通过混合多云的策略推进加速企业的数字化转型&#xff0c;其中边缘计算由于能够在靠近数据生成的地点和位置就近提供计算、网络、智能等关键能力&#xff0c;其不仅正成为构建“云边端”一体化的…

实验:验证TCP套接字传输的数据不存在数据边界

来源&#xff1a;《TCP/IP网络编程》 学习ing 自己动手&#xff0c;把坑踩一遍&#xff0c;也可以学习到很多。 Linux环境下: 客户端&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <…

23西安电子科技大学人工智能学院821考研录取情况

23西安电子科技大学人工智能学院821考研录取情况 01、人工智能学院各个方向 02、23人工智能学院一志愿考研录取情况总览、均分 PS&#xff1a;智能院23年院线相对于22年院线下降很多分&#xff0c;对于广大考生来说是一个好事 PS&#xff1a;1、总成绩均分在330-345之间&#…

封装一个类似微信通讯录带有字母检索功能的vue组件

这里我们直接使用scrollIntoView方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 语法 element.scrollIntoView&#xff08;&#xff09;; // 等同于element.scrollIntoView(true) element.scrollIntoView&#xff08;alignToTop&#xff09;; //布尔参数 element.scro…

新颖的文档、视频交互方式:以《GPT API Unofficial Docs》和《渐构》为例

一、背景 无意中看到一份 《GPT API 非官方文档》&#xff1a;https://gpt.pomb.us/ 被网站的交互方式所吸引&#xff0c;颇为新颖&#xff0c;值得借鉴。 左侧是对应的 API 代码调用示例&#xff0c;右侧是文档的每个部分&#xff0c;滑动到对应部分&#xff0c;左侧相关的代…

前台-倒计时hooks

import { useIntervalFn } from @vueuse/core import { ref, onUnmounted } from vue// 全部显示 天、时、分、秒 const setAllCountdownStr = (value: number) => {let second = parseInt(value.toString())const day = second / (3600 * 24) //3600秒等于60分钟等于1小时s…

已上架的App在AppStore上无法搜索到的问题

已上架的App在AppStore上无法搜索到的问题 在AppStore上搜不到已经上架的应用程序可以采取以下解决办法&#xff1a; 拨打iTunes提供的支持电话&#xff1a;4006-701-855&#xff08;中国时间9:00-17:00&#xff09;。发送邮件给Review团队&#xff0c;在iTunes Connect登录后…

ElasticSearch8.x和Java API Client

建议 建议直接阅读我的博客原文 10.4 Java API Client操作-索引库/文档 客户端更新 ES为不同语言提供了用于操作ES的客户端&#xff0c;截至2023年7月4日&#xff0c;根据官网Java REST Client已经被弃用&#xff0c;取而代之的是Java API Client&#xff0c;黑马的教程里都…

Docker(一)之 应用(Application)部署容器化的演进之路

前言 容器化技术可以帮助企业更大化资源利用&#xff0c;同时帮助项目相关人员&#xff08;开发、运维、测试、安全等&#xff09;以最小的成本实现项目快速上云部署&#xff0c;掌握容器化管理工具Docker&#xff0c;就掌握了云原生最基础、最核心技术之一 应用&#xff08;…

springboot整合hibernate,gradle,达梦8数据库,实现增删改查的功能

1.新建一个springboot项目&#xff0c;选择gradle管理 2.gradle添加以下依赖&#xff0c;gradle版本7.4 dependencies {// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webimplementation org.springframework.boot:spring-boot-starter…

Pytorch深度强化学习1-3:策略评估与贝尔曼期望方程详细推导

目录 0 专栏介绍1 从一个例子出发2 回报与奖赏3 策略评估函数4 贝尔曼期望方程5 收敛性证明 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#xff0c;辅…

ZUH-ACDM-网络-网闸-根据论坛的案例进行分析

H3C技术论坛&#xff1a;https://zhiliao.h3c.com/Theme/details/64343 文章目录 需求&#xff1a;源地址&#xff1a;172.16.1.33访问目的地址&#xff1a;192.168.4.233确认确定是主机确认外端机连接地址172.16.1.254确认内端机到源地址172.16.1.33是通的确认流量走向/路由第…

基于matlab使用高斯混合模型检测和计数视频序列中的汽车(附源码)

一、前言 此示例演示如何使用基于高斯混合模型 &#xff08;GMM&#xff09; 的前景检测器检测和计数视频序列中的汽车。 检测和计数汽车可用于分析交通模式。检测也是执行更复杂的任务&#xff08;例如按类型跟踪或分类车辆&#xff09;之前的第一步。 此示例演示如何使用前…

prometheus描点原理

大家好&#xff0c;我是蓝胖子&#xff0c;关于prometheus的入门教程有很多&#xff0c;拿我之前学prometheus的经历来讲&#xff0c;看了很多教程&#xff0c;还是会对prometheus的描点以及背后的统计原理感到迷惑&#xff0c;所以今天我们就来分析下这部分&#xff0c;来揭开…

AIGC - Stable Diffusion 的 墨幽人造人 模型与 Tag 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131565068 Stable Diffusion的模型网站 LiblibAI&#xff1a;https://www.liblibai.com 墨幽人造人网址&#xff1a;https://www.liblibai.com/m…

BUU [vnctf2023]电子木鱼

BUU [vnctf2023]电子木鱼 先看看题目&#xff0c;点不了。 看看源码。Rust整数溢出。 在 Rust 中&#xff0c;整数类型默认是有符号整数类型&#xff0c;意味着这些整数类型可以表示正数和负数。对于有符号整数类型&#xff0c;最高位用来表示符号&#xff0c;0 表示正数&…

如何在Microsoft Excel中快速创建等比序列

Excel 中的填充句柄允许你通过拖动句柄自动填充行或列中的数据列表&#xff08;数字或文本&#xff09;。这可以在大型工作表中输入顺序数据时节省大量时间&#xff0c;并提高工作效率。 如果数据遵循某个模式或基于其他单元格中的数据&#xff0c;则可以使用“自动填充”功能…