自学内容网 自学内容网

复原IP地址

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

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

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。

示例 1:

  • 输入:s = "25525511135"
  • 输出:["255.255.11.135","255.255.111.35"]

和切割回文字符串相似。切割问题可以抽象为树型结构,如图:

93.复原IP地址

# 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 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 中的任何数字。你可以按任何顺序返回答案。
from typing import List


class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        res = []
        # path = ''
        path = []
        self.backtracking2(s, 0, 0, path, res)
        return res
    #用来判断字符串中的IP是否合理,每个数0-255,不能0开头,用.分割
    def is_vaild(self, s, start, end):
        if start > end:
            return False
        #不能0开头
        if s[start] == '0' and start != end:
            return False
        #判断是否在0-255之间
        num = 0
        for i in range(start, end+1):
            #判断是否为数字
            if not s[i].isdigit():
                return False
            #判断是否在0-255之间
            num = num * 10 + int(s[i])
            if num > 255:
                return False
        return True
    #回溯函数,start_index表示当前遍历到字符串的哪个位置,path表示当前已经遍历的IP地址,还要有个pointNum的参数
    # 注意:由于Python字符串是不可变的,这里path + s[start_index:i + 1] + "."实际上是创建了一个新的字符串,
    # 所以在递归调用后不需要手动删除'.'
    # 如果path是可变类型,如列表,则需要在递归调用后进行回溯,即path.pop()
    # def backtracking(self, s, start_index, pointNum, path, res):
    #     #终止条件
    #     if pointNum == 3:
    #         #判断最后一段是否合理
    #         if self.is_vaild(s, start_index, len(s)-1):
    #             #最后一段合理则加入到path里
    #             path += s[start_index:]
    #             res.append(path)
    #         return
    #     #单层逻辑
    #     for i in range(start_index, len(s)):
    #         #判断当前字符串是否合理,切割的是start_index到i的字符串,左闭右闭
    #         if self.is_vaild(s, start_index, i):
    #             #回溯
    #             self.backtracking(s, i+1, pointNum+1, path + s[start_index:i+1] + '.', res)
    # 下述是用数组的方式
    def backtracking2(self, s, start_index, pointNum, path, res):
        if pointNum == 4:
            if start_index == len(s):
                res.append('.'.join(path))
            return
        for i in range(start_index, len(s)):
            if self.is_vaild(s, start_index, i):
                path.append(s[start_index:i+1])
                self.backtracking2(s, i+1, pointNum+1, path, res)
                path.pop()

#测试
if __name__ == '__main__':
    s = Solution()
    print(s.restoreIpAddresses('25525511135'))
#输出['255.255.11.135', '255.255.111.35']

 


原文地址:https://blog.csdn.net/weixin_52454379/article/details/142742441

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!