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
    }
}
posted @ 2020-07-30 18:45  ganshuoos  阅读(142)  评论(0编辑  收藏  举报