前往此题

解题思路

别看这题题目比较长,其实很简单。我们可以用分治法来解这道题。

把这道题拆成两个部分,只要我们能区分两个IP类型的特性,是不是就能分别对IPv4IPv6分而治之了?

IPv4

  1. .为分隔符,并且有效IPv4必定是只有3个.
  2. 每一个IP段必须是0~255之间的数值且只能是数值
  3. 如果检查到开头为0的数值,那该IP段必须为0
  4. 每个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

  1. 同样有效的IPv6地址必然是有且只有7个:符号
  2. 每个IP段长度不得超过4且不能等于0
  3. 每个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)