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地址中一组合法的数字。