• leetcode刷题笔记九十三题 复原IP地址


    leetcode刷题笔记九十三题 复原IP地址

    源地址:93. 复原IP地址

    问题描述:

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

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

    示例:

    输入: "25525511135"
    输出: ["255.255.11.135", "255.255.111.35"]

    /**
    本题使用的是回溯算法 + 剪枝去重思想
    回溯条件:begin == length && splitTimes == 4,即成功分割四次且到达字符串末尾
    剪枝条件比较多且杂:
    1.当length < 4 || length > 12 不能构成IP地址
    2.当length - begin < 4 - splitTimes || length - begin > 3 * (4 - splitTimes) 剩余部分不能构成IP地址
    3.使用isIpAddress判断地址码是否有效,这里主要判断两种情况,是否有0开头或者结果大于255
    */
    import scala.collection.mutable
    object Solution {
        def restoreIpAddresses(s: String): List[String] = {
            val length = s.length
            if (length < 4 || length > 12) return List()
            var path = new mutable.ListBuffer[Int]()
            var res = new mutable.ListBuffer[String]()
            var begin = 0
            var splitTimes = 0
    
            def isIpAddress(s: String, left: Int, right: Int): Int = {
                val length = right - left + 1
                if (length > 1 && s(left) == '0') return -1
                var res = 0
                for(i <- left to right) res = res*10 + (s(i) - '0')
                if (res > 255) return -1
                return res
            }
    
            def dfs(s: String, length: Int, splitTimes: Int, begin: Int): Unit = {
                if (begin == length && splitTimes == 4) res += path.mkString(".").toString
                if (length - begin < 4 - splitTimes || length - begin > 3 * (4 - splitTimes)) return
                for (i <- 0 to 2 if begin + i < length){
                    val ipAddress = isIpAddress(s, begin, begin+i)
                    if (ipAddress != -1){
                        path += ipAddress
                        dfs(s, length, splitTimes+1, begin+i+1)
                        path = path.dropRight(1)
                    }
                }
            }
            dfs(s, length, splitTimes, begin)
            return res.toList
        }
    }
    
  • 相关阅读:
    SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh 规格严格
    yml文件中配置对称加密{cipher}无法识别 规格严格
    运行MeeGo S“.NET研究”DK 的linux版本 狼人:
    [Typescript] Excess property checking
    [Typescript] Making TypeScript Stick 3
    [Typescript] Tuple type usage example & Discriminated Unions
    [TypeScript] infer
    [TypeScript] Interface
    [Typescript] Construct Signatures
    [Typescript] Recursion Type
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13405716.html
Copyright © 2020-2023  润新知