首页 > 其他分享 >代码随想录Day24

代码随想录Day24

时间:2024-08-23 21:29:30浏览次数:8  
标签:pointNum return int Day24 代码 随想录 合法 startIndex 逗点

93.复原IP地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 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 仅由数字组成


正解(回溯)

这是切割问题,切割问题就可以使用回溯搜索法把所有可能性搜出来
切割问题可以抽象为树型结构

  1. 递归参数
    startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。
    本题我们还需要一个变量pointNum,记录添加逗点的数量。
  2. 递归终止条件
    本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。
    pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。
    然后验证一下第四段是否合法,如果合法就加入到结果集里
  3. 单层搜索的逻辑
    如果合法就在字符串后面加上符号.表示已经分割。
    如果不合法就结束本层循环,如图中剪掉的分支:

    然后就是递归和回溯的过程:
    递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符.),同时记录分割符的数量pointNum 要 +1。
    回溯的时候,就将刚刚加入的分隔符. 删掉就可以了,pointNum也要-1。
上代码(●'◡'●)
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;
    }
};

标签:pointNum,return,int,Day24,代码,随想录,合法,startIndex,逗点
From: https://www.cnblogs.com/Murder-sans/p/18377106/dmsxl_Day24

相关文章

  • PDH鉴频信号_python代码
    PDH鉴频信号PHD原理与代码PHD原理PHD鉴频信号幅度和频率的关系图代码PHD原理与代码PHD原理PDH技术中以腔的基模频率为参考,使用腔的反射信号来制备误差信号。具体地,考虑一个幅度为......
  • 一道笔试题:利用JS代码实现防抖和节流
    防抖(Debounce)防抖的目的是在一系列连续的调用中,只有在最后一次调用后的一段时间内没有新的调用才会执行该函数。这对于一些需要在用户停止操作后才执行的场景非常有用,比如输入框的搜索建议。functiondebounce(func,wait){lettimeout;returnfunction(){cons......
  • 微软RDL远程代码执行超高危漏洞(CVE-2024-38077)漏洞检测排查方式
    漏洞名称:微软RDL远程代码执行超高危漏洞(CVE-2024-38077)CVSScore:  9.8漏洞描述:CVE-2024-38077是微软近期披露的一个极其严重的远程代码执行漏洞。该漏洞存在于Windows远程桌面许可管理服务(RDL)中,攻击者无需任何权限即可实现远程代码执行,获取服务器最高权限。由于在解码用......
  • cloud compare 学习利用CC代码加快插件开发与总结(三)
    建议看过前面的文章后,再开始本文的学习cloudcompare二次插件化功能开发详细步骤(一)cloudcomparePCA插件开发详细步骤(二)附代码本文完成一个点云变换的插件,同时也是对CC接口的使用做进一步说明,进一步理解CC插件开发流程这个功能在cc已有的功能已经存在,位于edit->app......
  • 代码实现WordPress主动推送及自动推送至百度搜索收录
    站长们辛辛苦苦写的文章,无非就是让百度收录,也可以帮助人,也可以给自己站或者帮人优化的站带来流量,今天就来发一篇关于wordprss主动推送给百度的方法;使用方法,U8格式放在wp当前模板functions.php里即可12345678910111213141516171819202122232425262......
  • 批量检测微信小程序封禁状态的示例代码以及接口
    以下是一个PHP脚本示例,演示了如何批量检查多个微信小程序的封禁状态。您只需要将示例中的`appid1`,`appid2`,`appid3`替换为您实际的小程序应用ID,即可获取各个小程序的状态信息。```php<?php//需要检查的小程序AppID列表$appIds=array('appid1','appid2','a......
  • 【面向对象】06一文搞懂抽象和接口 类与类之间的关系 抽象类与接口的相同点与不同点(
    文章目录一、抽象1.抽象类与抽象方法2.抽象方法的特点二、接口1.interface2.接口特征三、类与类之间的关系四、抽象类VS接口相同点不同点一、抽象1.抽象类与抽象方法//抽象类publicabstractclassPet{//抽象方法 publicabstractvoidtoHospital......
  • 织梦DedeCms代码高亮怎么实现
    织梦DedeCMS实现代码高亮可以通过多种方法来完成,以下是一些常见的方法:方法一:使用PHP标签实现当前栏目高亮在模板文件中使用PHP标签:在织梦的模板文件中,可以使用 {dede:php} 标签来嵌入PHP代码,实现当前栏目的高亮显示。例如,可以使用以下代码片段来获取当前栏目的ID,并为......
  • 【pytest】 在启动任务时将自定义参数传入代码中
    1.使用 pytest_addoption 钩子函数你可以在 conftest.py 文件中使用 pytest_addoption 钩子函数来定义自定义命令行参数。然后,你可以在你的测试文件中通过 request fixture来访问这些参数。conftest.py#contentofconftest.pyimportpytestdefpytest_ad......
  • zblog免费插件分享前端代码支持一键复制
    zblog默认的代码文件在网页前端是不支持一键复制的,这会让访客复制长代码的时候不太方便,甚至有可能会出错,影响体验,下面分享一个非常简单的免费插件,安装之后,前端代码就能一键复制了。插件使用方法:1、点击最下方链接下载插件2、打开zblog后台,在插件管理里面上传刚下载的插件,安装......