LeetCode - #93 复原 IP 地址

在这里插入图片描述

在这里插入图片描述

前言

本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新到 91 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:中等

1. 描述

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

  • 例如:"0.1.2.201""192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1" 是 无效 IP 地址。
    给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的 有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

2. 示例

示例 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 仅由数字组成

3. 答案

class Solution {
    func restoreIpAddresses(_ s: String) -> [String] {
        // 所有结果
        var res = [String]()
        // 临时存放每一次的结果
        var ans = [String]()

        func validIp(_ str: String, _ start: Int) {
            // 集齐4个有效IP段, 并且后面没有更多数字了,就可加入答案
            if ans.count == 4, start >= str.count {
                res.append(ans.joined(separator: "."))
                return
            }
            
            // 每个IP段都可以是1/2/3位数字
            for j in start ... start+2 {
                // 排除越界情况
                if j > str.count-1 {
                    break
                }
                
                // -- 最恶心的是这个截取子串,不支持 Range<Int>,非要用Range<String.Index> --
                let idx0 = str.index(str.startIndex, offsetBy: start)
                let idx1 = str.index(str.startIndex, offsetBy: j)
                let substr = str[idx0 ... idx1]
                // ----------------------------------------

                // 万一题目稍微改动,不保证纯数字就不能强转,这样写更保险
                guard let num = Int(substr) else {
                    break
                }
                
                // 每一段数字只能是 0 <= x <= 255
                if num > 255 {
                    break
                }
                
                // 排除0开头的数字 如 "012"
                if substr != String(num) {
                    break
                }
                
                // 排除剩余的数字超过了所需数字上限 N*3
                if (str.count - j - 1) > (4 - ans.count)*3 {
                    continue
                }
                
                // ---- 以下是回溯套路 -----

                // 做出选择
                ans.append(String(substr))
                // 递归查找下一段
                validIp(str, j+1)
                // 撤销选择
                ans.removeLast()
            }
        }

        validIp(s, 0)
        return res
    }
}

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。

相关推荐

  1. leetcode93. 复原 IP 地址

    2024-07-13 01:44:01       44 阅读
  2. leetcode 93. 复原 IP 地址

    2024-07-13 01:44:01       62 阅读
  3. LeetCode 93. 复原 IP 地址

    2024-07-13 01:44:01       48 阅读
  4. LeetCode 93. 复原 IP 地址

    2024-07-13 01:44:01       35 阅读
  5. leetcode93.复原IP地址

    2024-07-13 01:44:01       34 阅读
  6. LeetCode 93.复原IP地址 Python题解

    2024-07-13 01:44:01       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 01:44:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 01:44:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 01:44:01       45 阅读
  4. Python语言-面向对象

    2024-07-13 01:44:01       55 阅读

热门阅读

  1. SSH协议

    SSH协议

    2024-07-13 01:44:01      17 阅读
  2. 【Spring Boot】spring boot主启动类_内置服务

    2024-07-13 01:44:01       18 阅读
  3. qt 折线图

    2024-07-13 01:44:01       19 阅读
  4. 【Linux】02.shell命令及其运行原理

    2024-07-13 01:44:01       22 阅读
  5. RAG的上限在哪里?边界在哪里?

    2024-07-13 01:44:01       19 阅读
  6. 我的大事记

    2024-07-13 01:44:01       17 阅读
  7. 每天一个数据分析题(四百二十八)- 方差分析

    2024-07-13 01:44:01       21 阅读
  8. C++ 函数返回值是void* 使用场景

    2024-07-13 01:44:01       19 阅读
  9. 2974.最小数字游戏

    2024-07-13 01:44:01       18 阅读
  10. ahb 总线的一些思考

    2024-07-13 01:44:01       20 阅读
  11. 级联目标检测:构建高效目标识别的多阶段策略

    2024-07-13 01:44:01       19 阅读
  12. C语言8 数组与字符串

    2024-07-13 01:44:01       18 阅读
  13. 人工智能讲座——深度学习实现行人重识别

    2024-07-13 01:44:01       18 阅读