[Mdfs] lc93. 复原 IP 地址(dfs+剪枝优化+判断IP标准库)

1. 题目来源

链接:93. 复原 IP 地址

前置题目:

题单:

  • 待补充

2. 题目解析

一道经典的 dfs 问题,但是有很多可以剪枝的地方需要注意。具体的见代码注释即可。

主要思想和 子集 啥的,差不多,就是在两个字符之间填 “.” 进去做分割。看看能填几段,或者将此题理解成将字符串分成 4 段,判断是否构成合法 IP 也行。


  • 时间复杂度 O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度 O ( n ) O(n) O(n)

func restoreIpAddresses(s string) []string {
    n := len(s)
    res := []string{}
    path := []string{}
    var dfs func(int)
    dfs = func(u int) {
        if len(path) > 4 {  // path 多于 4,则直接 return 
            return
        }
        if u == n && len(path) == 4 {
            s := path[0]
            for i := 1; i < len(path); i ++ {
                s += "."
                s += path[i]                
            }
            if ip := net.ParseIP(s); ip != nil {
                res = append(res, s)
            }
            return
        }

        for i := u; i < len(s); i ++ {
            if s[u] == '0' && i - u > 1 {   // 2位及以上时,必须 无前缀 0
                return 
            }
            if i + 1 - u > 3 {   // 必须是 1-3 位
                return
            }
            path = append(path, s[u:i+1])
            dfs(i + 1)
            path = path[:len(path) - 1]
        }
    }

    dfs(0)
    return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值