LeetCode93题改编:复原IPv6地址——Python递归与迭代解法

1. 复原IPv6地址

LeetCode93题:复原IP地址中要求复原的是IPv4地址,本文将问题改编为复原IPv6地址。

IPv6地址由8组16进制的数字来表示,每组表示16比特。这些组数字通过(":")分割。
比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334是一个有效的地址。而且,我们可以加入一些以0开头的数字,字母可以使用大写,也可以是小写。所以,2001:db8:85a3:0:0:8A2E:0370:7334也是一个有效的IPv6地址(忽略0开头,忽略大小写)。

然而,我们不能因为某个组的值为0,而使用一个空的组,以至于出现("::")的情况。
比如,2001:0db8:85a3::8A2E:0370:7334是无效的IPv6地址。

同时,在IPv6地址中,多余的0也是不被允许的。比如,02001:0db8:85a3:0000:0000:8a2e:0370:7334是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

示例1:
输入:s=‘20010db885a3000000008a2e03707334’
输出:[‘2001:0db8:85a3:0000:0000:8a2e:0370:7334’]

示例2:
输入:s=‘2e0370733’
输出:[‘2:e:0:3:7:0:7:33’, ‘2:e:0:3:7:0:73:3’, ‘2:e:0:3:7:07:3:3’, ‘2:e:0:3:70:7:3:3’, ‘2:e:0:37:0:7:3:3’, ‘2:e:03:7:0:7:3:3’, ‘2:e0:3:7:0:7:3:3’, ‘2e:0:3:7:0:7:3:3’]

示例3:
输入:s=‘2e037073’
输出:[‘2:e:0:3:7:0:7:3’]

2. Python代码
2.1 递归
import re

def restoreIpAddresses(s):
    result = []
    def addOnePoint(src, dst, cnt):
        if not src and cnt == 8:
            result.append(dst[:-1])
        if src and cnt < 8:
            for i in range(1, 5):
                if len(src) >= i and re.match('[\dA-Fa-f]{1,4}$', src[:i]):
                    addOnePoint(src[i:], dst + src[:i] + ':', cnt + 1)
    addOnePoint(s, '', 0)
    return result

print(restoreIpAddresses('20010db885a30000000008a2e03707334'))
print(restoreIpAddresses('20010db885a3000000008a2e03707334'))
print(restoreIpAddresses('2e0370733'))
print(restoreIpAddresses('2e037073'))
print(restoreIpAddresses('2e03707'))

实验结果:
[]
[‘2001:0db8:85a3:0000:0000:8a2e:0370:7334’]
[‘2:e:0:3:7:0:7:33’, ‘2:e:0:3:7:0:73:3’, ‘2:e:0:3:7:07:3:3’, ‘2:e:0:3:70:7:3:3’, ‘2:e:0:37:0:7:3:3’, ‘2:e:03:7:0:7:3:3’, ‘2:e0:3:7:0:7:3:3’, ‘2e:0:3:7:0:7:3:3’]
[‘2:e:0:3:7:0:7:3’]
[]

2.2 迭代
import re

def restoreIpAddresses(s):
    result = []
    stack = [(s, '', 0)]
    while stack:
        src, dst, cnt = stack.pop()
        if not src and cnt == 8:
            result.append(dst[:-1])
        if src and cnt < 8:
            for i in range(5, 0, -1):
                if len(src) >= i and re.match('[\dA-Fa-f]{1,4}$', src[:i]):
                    stack.append((src[i:], dst + src[:i] + ':', cnt + 1))
    return result

print(restoreIpAddresses('20010db885a30000000008a2e03707334'))
print(restoreIpAddresses('20010db885a3000000008a2e03707334'))
print(restoreIpAddresses('2e0370733'))
print(restoreIpAddresses('2e037073'))
print(restoreIpAddresses('2e03707'))

实验结果:
[]
[‘2001:0db8:85a3:0000:0000:8a2e:0370:7334’]
[‘2:e:0:3:7:0:7:33’, ‘2:e:0:3:7:0:73:3’, ‘2:e:0:3:7:07:3:3’, ‘2:e:0:3:70:7:3:3’, ‘2:e:0:37:0:7:3:3’, ‘2:e:03:7:0:7:3:3’, ‘2:e0:3:7:0:7:3:3’, ‘2e:0:3:7:0:7:3:3’]
[‘2:e:0:3:7:0:7:3’]
[]

2.3 代码解读:

详细解读请看LeetCode93题:复原IP地址——Python递归与迭代解法。本文代码的不同之处为:利用正则表达式'[\dA-Fa-f]{1,4}$'判断一个字符串是否为IPv6地址中一组合法的数字。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值