当前位置: 首页 > news >正文

LeetCode[93] 复原 IP 地址

回溯大法

  1. IP地址有四个位置,每个位置的范围为 [0,255]
  2. 当0开头时,这个位置只能为0,不能为00或者01等其他值
  3. 当四个位置都被填充 或者 字符串被使用完时,进行回溯
    • 其中,四个位置都被填充 并且 字符串被使用完时,代表发现一个新的IP地址
    • 其他情况均不合法,直接返回
  4. 每一次回溯之后,尝试在当前IP位置再加一位,进行边界判定
    • 判定成功,则继续递归寻找下一个位置的值
    • 判定失败,则进行回溯,回溯到上一个位置
class Solution {
private:
    static constexpr int SEG_COUNT = 4;
    vector<string> res;
    vector<int>segments;
public:
    void dfs(const string &s, int segID, int str_start)
    {
        if(segID == SEG_COUNT) // 四个位置均被填充
        {
            if(str_start == s.size()) // 并且所有字符均被使用
            {
            	// 将发现的IP加入res中等待返回
                string IPAddr = "";
                for(int i=0;i<SEG_COUNT;i++)
                {
                    IPAddr += to_string(segments[i]);
                    if(i != SEG_COUNT-1)
                        IPAddr += ".";
                }
                res.push_back(IPAddr);
            }
            return;
        }

        if(str_start == s.size()) // 四个位置未被全部填充,但是字符串已经被使用完毕
            return;
        
        if(s[str_start] == '0') // 该位置的其实字符为0,则该位置只能为0,直接递归寻找下一个位置
        {
            segments[segID] = 0;
            dfs(s, segID+1, str_start+1);
            return;
        }
		
		// 不断递归,回溯
        int addr = 0;
        for(int i=str_start; i<s.size(); i++)
        {
            addr = addr*10 + (s[i]-'0'); // 不断尝试增大当前位置的值
            if(addr>255) // 值不合法,则当前位置的值遍历完毕,回溯
                return;
            // 合法,则更新并继续递归
            segments[segID] = addr;
            dfs(s, segID+1, i+1);
        }
    }

    vector<string> restoreIpAddresses(string s) {
        segments.resize(SEG_COUNT);
        dfs(s, 0, 0);
        return res;
    }
};
http://www.dtcms.com/a/79404.html

相关文章:

  • Mimikyu综合靶场训练
  • 大数据学习(74)-Hue元数据
  • Python标准库之os模块常用方法
  • Excel Script Lab学习笔记
  • Pytorch使用手册(专题五十)—自定义运算符
  • 《Python深度学习》第三讲:神经网络
  • sqlite mmap
  • nginx配置反向代理数据库等插件的原理和方式
  • Java线程6种状态的详细说明、状态转换关系(UML展示)
  • 汽车安全确认等级-中国等保
  • springboot基于session实现登录
  • 深入解析过滤器模式(Filter Pattern):一种灵活高效的设计模式
  • 让vscode远程开发也可以图形显示
  • 基于BClinux8部署Ceph 19.2(squid)集群
  • Coco AI 智能检索 Hugo Blog 集成指南
  • 我的python学习记录
  • 【蓝桥杯】省赛:分糖果(思维/模拟)
  • Kotlin 基础语法
  • C# 语法糖
  • Docker build 会在本地产生巨大的文件
  • 计算机视觉技术探索:美颜SDK如何利用深度学习优化美颜、滤镜功能?
  • 如何选择合适的SSL服务器证书
  • 深入理解 Vue.js 中的 <keep-alive>:使用技巧与注意事项
  • c#:使用Modbus RTU协议
  • 高频SQL50题 第一天 | 1757. 可回收且低脂的产品、584. 寻找用户推荐人、595. 大的国家、1683. 无效的推文、1148. 文章浏览 I
  • 3.19刷题
  • 【VUE】day05-ref引用
  • 3.18-1
  • 基于Spring Boot的冷链物流系统的设计与实现的设计与实现(LW+源码+讲解)
  • docker需要sudo才能使用