解题思路
别看这题题目比较长,其实很简单。我们可以用分治法来解这道题。
把这道题拆成两个部分,只要我们能区分两个IP类型的特性,是不是就能分别对IPv4
与IPv6
分而治之了?
IPv4
- 以
.
为分隔符,并且有效IPv4必定是只有3个.
- 每一个
IP
段必须是0~255之间的数值且只能是数值 - 如果检查到开头为0的数值,那该IP段必须为0
- 每个IP段必须长度大于0且小于4
根据以上4个特点我们已经可以写出判断是否是有效IP地址的函数了
def validV4(self, IP):
nums = IP.split('.')
for x in nums:
if len(x) == 0 or len(x) > 3:
return 'Neither'
if x[0] == '0' and len(x) != 1 or not x.isdigit() or int(x) > 255:
return 'Neither'
return 'IPv4'
IPv6
- 同样有效的
IPv6
地址必然是有且只有7个:
符号 - 每个IP段长度不得超过4且不能等于0
- 每个IP段只能包含数字和
a
-f
的英文字符,包含大小写
def validV6(self, IP):
nums = IP.split(":")
hexdigits = '0123456789abcdefABCDEF'
for x in nums:
if len(x) == 0 or len(x) > 4 or not all(c in hexdigits for c in x):
return 'Neither'
return 'IPv6'
代码
class Solution:
def validIPAddress(self, IP: str) -> str:
if IP.count('.') == 3:
return self.validV4(IP)
elif IP.count(':') == 7:
return self.validV6(IP)
return 'Neither'
def validV4(self, IP):
nums = IP.split('.')
for x in nums:
if len(x) == 0 or len(x) > 3:
return 'Neither'
if x[0] == '0' and len(x) != 1 or not x.isdigit() or int(x) > 255:
return 'Neither'
return 'IPv4'
def validV6(self, IP):
nums = IP.split(":")
hexdigits = '0123456789abcdefABCDEF'
for x in nums:
if len(x) == 0 or len(x) > 4 or not all(c in hexdigits for c in x):
return 'Neither'
return 'IPv6'
复杂度分析
- 时间复杂度 O(1)
- 空间复杂度 O(1)