算法题-所有合法IP地址 - Python

所有合法IP地址

问题描述:

给你一个仅仅有数字组成的字符串 s 插入3个点 . 行程一个合法的IP地址,请输出所有的合法IP地址。
IP地址组成有4段,每段大小范围:0~255

限制条件:

字符串 s 长度小于等于 12
字符串 s 均有数字组成

示例:

输入:s=‘1234’
输出:[‘1.2.3.4’]
解释:很显然只有一个合格

示例:

输入:s=‘12345678’
输出:[‘1.234.56.78’, ‘12.34.56.78’, ‘123.4.56.78’, ‘123.45.6.78’, ‘123.45.67.8’]
解释:多个合格,均输出

问题分析:

题目中规中矩,回溯题目,深度优先搜索+减枝操作
(1) 遍历字符串,每次选字符串开头长度为 :1 23 的子串加入 path 数组中,然后把剩下的字符串传递到下个位置上,接着循环递归。
(2) 递归出口:
if len(path) > 4: return :超出限制 返回上一层
if len(path) == 4 and sLen == n :恰好等于4,且已经用的字符串长度=原字符串总长度,合格输出一次

Python3实现:

# @Time   :2023/08/23
# @Author :Liu
# 深度优先 + 剪枝

class Solution:
    def isValidIp(self, digitstr):

        if (n:=len(digitstr)) > 12:  # 总的长度3*4,4段 每段长度不超过3
            return []

        res = []
        def dfs(s, path, sLen):
            if len(path) > 4: return
            if len(path) == 4 and sLen == n:
                res.append('.'.join(path))

            for i in range(1, min(4, len(s) + 1)):  # 每一位 长度不超过4

                if 0 <= int(s[:i]) <= 255:  # 大小 范围限制
                    path.append(s[:i])
                    dfs(s[i:], path, sLen + i)
                    path.pop()

        dfs(digitstr, [], 0)
        return res


if __name__ == '__main__':
    solu = Solution()
    print(solu.isValidIp('12345678'))  # ['1.234.56.78', '12.34.56.78', '123.4.56.78', '123.45.6.78', '123.45.67.8']

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

你可能感兴趣的:(Python,算法,python,算法)