当前位置: 首页 > 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;
    }
};

相关文章:

  • 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 会在本地产生巨大的文件
  • 湖北海厦建设有限公司网站/百度云官网登录首页
  • 廊坊做网站企业教程/电商培训机构靠谱吗
  • 做网站公司排行/南京seo培训
  • 宝安中心做网站多少钱/重庆好的seo平台
  • 湛江大型网站模板建设/免费的模板网站
  • 网络培训的建议/seo自然排名优化