[力扣题解]93. 复原 IP 地址

题目:93. 复原 IP 地址

思路

回溯法;
特别的是,用pointNum来记录.的数量,并且没有创建path,而是直接在原来的strings中插入.
同时,在判断子串合法性的时候,0是合法的,0100是不合法的;

代码

Method 1


class Solution {
public:

    vector<string> result; //

    void backtracking(string& s, int startIndex, int pointNum)
    {
        int i;
        if(pointNum == 3)
        {
            string temp1 = s.substr(startIndex, s.size()-startIndex);
            if(isValid(temp1))
            {
                result.push_back(s);
            }
            return;
        }
        for(i = startIndex; i < s.size(); i++)
        {
            // 判断子区间[startIndex, i]是否合法ß
            string temp2 = s.substr(startIndex, i-startIndex+1);
            if(isValid(temp2))
            {
                s.insert(s.begin()+i+1, '.'); //你为什么要加一个s.begin()
                // pointNum++;
                backtracking(s, i+2, pointNum+1);
                // pointNum--;
                s.erase(s.begin()+i+1);
            }
            // 不合法, 直接结束
            else
            {
                break;
            }
        }
    }
    // 使用 istringstream
    bool isValid(const string& s)
    {
        // 为空也不行
        if(s.empty())
        {
            return false;
        }
        int num;
        istringstream ss(s);
        ss >> num;
        // 0 <= num <= 255
        if(!(num >= 0 && num <= 255))
        {
            return false;
        }
        // 00 也不可以
        if(s.size() > 1 && s[0] == '0')
        {   
            return false;
        }
        return true;
    }
    
    vector<string> restoreIpAddresses(string s) 
    {
        result.clear();
        if(s.size() < 4 || s.size() > 12)
        {
            return result;
        }
        backtracking(s, 0, 0);
        return result;
    }
};

回溯pointNum用这个:backtracking(s, i+2, pointNum+1);

Method 2

class Solution {
public:

    vector<string> result; //

    void backtracking(string& s, int startIndex, int pointNum)
    {
        int i;
        if(pointNum == 3)
        {
            string temp1 = s.substr(startIndex, s.size()-startIndex);
            if(isValid(temp1))
            {
                result.push_back(s);
            }
            return;
        }
        for(i = startIndex; i < s.size(); i++)
        {
            // 判断子区间[startIndex, i]是否合法ß
            string temp2 = s.substr(startIndex, i-startIndex+1);
            if(isValid(temp2))
            {
                s.insert(s.begin()+i+1, '.'); //你为什么要加一个s.begin()
                pointNum++;
                backtracking(s, i+2, pointNum);
                pointNum--;
                s.erase(s.begin()+i+1);
            }
            // 不合法, 直接结束
            else
            {
                break;
            }
        }
    }
    // 使用 istringstream
    bool isValid(const string& s)
    {
        // 为空也不行
        if(s.empty())
        {
            return false;
        }
        int num;
        istringstream ss(s);
        ss >> num;
        // 0 <= num <= 255
        if(!(num >= 0 && num <= 255))
        {
            return false;
        }
        // 00 也不可以
        if(s.size() > 1 && s[0] == '0')
        {   
            return false;
        }
        return true;
    }
    
    vector<string> restoreIpAddresses(string s) 
    {
        result.clear();
        if(s.size() < 4 || s.size() > 12)
        {
            return result;
        }
        backtracking(s, 0, 0);
        return result;
    }
};

回溯pointNum用这个:

pointNum++;
pointNum--;

Method 3

类似于C的写法,基础方法,求出string代表的int;


    bool isValid(const string& s, int start, int end)
    {
        int i = 0;
        int num = 0;
        // 一直喜欢用各种奇奇怪怪函数的carl怎么没借助C++专门的工具?
        if(start > end)
        {
            return false;
        }
        // '0' 开头的数字不合法, 不包括数字'0'
        if(s[start] == '0' && start != end)
        {
            return false;
        }
        for(i = start; i <= end; i++)
        {
            // 遇到非数字字符不合法
            // if(!(s[i] >= 0 && s[i] <= 9))
            if(s[i] > '9' || s[i] < '0')
            {
                return false;
            }
            num = num * 10 + (s[i] - '0');
            // 如果大于255, 不合法
            if(num > 255)
            {
                return false;
            }
        }
        return true;
    }
    

疑问

上述代码中使用了string.insert(s.begin()+i+1, '.')的方式来进行插入操作,而我随便搜索的教程里没有用迭代器s.begin()来表示插入位置的,都是直接用序号,比如string(i+1, "."),然而我这么写力扣反而报错了,很奇怪,很奇怪;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这是一关于DSC相关的文档

这是一关于DSC相关的文档 上面这幅图清晰的展示了somewhat flat的像素图示

CRMEB 开源/标准版商城系统客服配置教程

管理后台/设置/系统设置/商城配置/客服端配置 有系统客服/拨打电话/跳转链接可选&#xff0c;系统客服为系统自带的客服系统&#xff0c;拨打电话为用户点击联系客服为拨打客服电话的方式&#xff0c;跳转链接为可以跳转自己开发的客服系统或者第三方的客服系统或者企业微信的…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习&#xff0c;其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统&#xff0c;cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件&#xff0c;大家也可以直接看 ectd-releases 界面选择…

开源交互审计系统:功能强大、安全好用【送源码】

在当今信息化时代&#xff0c;网络安全越来越受到重视。传统的远程控制工具&#xff0c;如RDP、SSH、VNC等&#xff0c;虽然方便易用&#xff0c;但存在安全隐患&#xff0c;容易被黑客利用。很多时候我们都需要做一些防护的处理来来保障网络安全。 今天了不起来分享一款开源好…

OSPF链路状态数据库

原理概述 OSPF是一种基于链路状态的动态路由协议&#xff0c;每台OSPF路由器都会生成相关的LSA&#xff0c;并将这些LSA通告出去。路由器收到LSA后&#xff0c;会将它们存放在链路状态数据库LSDB中。 LSA有多种不同的类型&#xff0c;不同类型的LSA的功能和作用是不同的&…

LearnOpenGL(十一)之光源

一、投光物 将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 二、平行光 当一个光源处于很远的地方时&#xff0c;来自光源的每条光线就会近似于互相平行&#xff0c;我们可以称这些光为平行光。当我们使用一个假设光源处于无限远处的模型时&#xff0c;它就被称为定向…

django显示网页步骤

显示网页步骤 小白的django学习笔记 2024/5/6 8:30 文章目录 显示网页步骤创建输入框&#xff08;文本、单选、多选&#xff09;效果如何在django中显示网页写函数配置地址运行&#xff0c;要选择这个工程名的&#xff0c;使用socket复制ip&#xff0c;后面在加上名字,成功&…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说&#xff0c;一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

react+antd --- 日期选择器,动态生成日期表格表头

先看一下效果---有当前月的日期 技术: 1: react 2:antd-UI库 -- table 3:moment--时间处理库 代码效果: import { Button, DatePicker, Table } from antd; import { useEffect, useState } from react; import moment from moment;function Club() {const [selecte…

Vue3自定义封装音频播放组件(带拖拽进度条)

Vue3自定义封装音频播放组件&#xff08;带拖拽进度条&#xff09; 描述 该款自定义组件可作为音频、视频播放的进度条&#xff0c;用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

特征融合篇 | YOLOv8改进之利用ASF-YOLO重构特征融合层 | 助力小目标检测

前言:Hello大家好,我是小哥谈。ASF-YOLO是一个目标检测模型,它基于YOLOv3算法,并引入了ASF(Anchor-Free Spatial Attention)模块。ASF模块可以自适应地学习特征图上每个位置的不同感受野,提高了模型对于小目标的检测能力。相比于YOLOv3,ASF-YOLO在保持准确率的同时大大…

3d里如何做螺旋状模型?---模大狮模型网

螺旋状模型在3D设计中常常被运用&#xff0c;不仅可以用于创造独特的装饰品和艺术品&#xff0c;还可以用于建筑设计、工程模拟等领域。然而&#xff0c;对于初学者而言&#xff0c;如何在3D软件中创建螺旋状模型可能是一个挑战。在本文中&#xff0c;我们将分享几种简单而有效…

Linux diff命令(比较两个文件或目录的内容差异)

文章目录 Linux diff 命令详解教程基本用法比较文件输出解释 递归比较&#xff08;-r&#xff09;示例代码 控制输出格式统一格式&#xff08;-u&#xff09;上下文格式&#xff08;-c&#xff09; 高级选项忽略所有空白差异&#xff08;-w&#xff09;仅报告文件是否不同 Linu…

【Web】CTFSHOW 单身杯 题解

目录 web签到 easyPHP 姻缘测试 web签到 用data协议包含php标签闭合 payload: filedata://text/plain,<?php system($_GET[1]);?>>?;)]1[TEG_$(metsys php?<,nialp/txet//:atadeasyPHP 一眼awk命令执行 payload: cmdawk&param{system("ta…

MySQL数据库连接 提示错误 10060

错误现象 Cant connect to server on (10060) 有3个原因&#xff1a; 1、防火墙没有关闭 &#xff08;注意如果配置开放了3306端口&#xff0c;则不可以关闭防火墙&#xff0c;需删除规则以后才能关闭&#xff09; 关闭防火墙&#xff08;1次&#xff09;systemctl stop fir…

数据结构_顺序表中基本操作的实现_代码

学习笔记&#xff0c;仅供参考 1.头文件 2.初始化 3.增加值 4.根据下标取值 5.查找 6.插入 7.删除 8.动态增加数组的长度 9.所有代码 10.运行结果 1.头文件 //顺序表的实现——动态分配 #include<stdio.h> #include<stdlib.h> #define InitSize 10 type…

Arduino-点亮TFT触摸屏一

Arduino-点亮TFT触摸屏一 1.概述 这篇文章主要介绍Arduino操作TFT触摸屏入门操作&#xff0c;通过SPI通信协议方式点亮TFT触摸屏。 2.硬件电路 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻5面包板1杜邦线…

ICode国际青少年编程竞赛- Python-3级训练场-if语句入门

ICode国际青少年编程竞赛- Python-3级训练场-if语句入门 1、 for i in range(5):Spaceship.step(i 1)Spaceship.turnRight()if i 1:Dev.step(1)Dev.step(-1)2、 for i in range(4):Dev.step(2)if i ! 1:Dev.turnLeft()Dev.step(3)Dev.step(-3)Dev.turnRight()3、 for i…

springboot3项目练习详细步骤(第三部分:文章管理模块)

目录 发布文章 接口文档 业务实现 自定义参数校验 项目参数要求 实现思路 实现步骤 文章列表(条件分页) 接口文档 业务实现 mapper映射 更新文章 接口文档 业务实现 获取文章详情 接口文档 业务实现 删除文章 接口文档 业务实现 文章管理业务表结构…

OpenHarmony实战开发——WLAN驱动框架介绍及适配方法

1. WLAN 驱动框架概述 WLAN 是基于 HDF(Hardware Driver Foundation)驱动框架开发的模块&#xff0c;该模块可实现跨操作系统迁移、自适应器件差异、模块化拼装编译等功能。从而降低 WLAN 驱动开发的难度&#xff0c;减少 WLAN 驱动移植和开发的工作量。 本文主要分析 WLAN 驱…