大家好,我是 @负雪明烛。点击右上方的「+关注,优质题解不间断!

题目大意

验证一个字符串是有效的 IP 地址吗?

有效的 IP 地址分为 IPv4 和 IPv6 两种。

具体规则,可以见题目所述。

解题方法

字符串处理

可以定义两个函数,一个判断字符串是否为 IPv4 地址,另一个函数判断是否字符串是否为 IPv6 地址。

对于字符串处理的问题,我一般使用 Python 来做, 因为 Python 处理字符串非常简单。

判断 IPv4 的时候,把字符串按照 "."分割,判断分割后是不是有 $4$ 部分,每一部分的取值应该在 468. 验证IP地址 - 图1之间,并且没有前导 $’’0”$。

判断 IPv6 的时候,把字符串按照 ":"分割,判断分割后是不是有 468. 验证IP地址 - 图2部分;每一部分的长度应该是 $4$,并且应该是有效的 $16$ 进制的字符串,即在 "0123456789abcdefABCDEF"之中;且允许前导 $0$。

代码

直接看 Python 代码。

  1. class Solution(object):
  2. def validIPAddress(self, IP):
  3. if '.' in IP and self.checkIPv4(IP):
  4. return "IPv4"
  5. elif ':' in IP and self.checkIPv6(IP):
  6. return "IPv6"
  7. else:
  8. return "Neither"
  9. def checkIPv4(self, IP):
  10. numbers = IP.split('.')
  11. if len(numbers) != 4: return False
  12. for num in numbers:
  13. if not num or (not num.isdecimal()) or (num[0] == '0' and len(num) != 1) or int(num) > 255:
  14. return False
  15. return True
  16. def checkIPv6(self, IP):
  17. valid16 = "0123456789abcdefABCDEF"
  18. if "::" in IP: return False
  19. numbers = IP.split(':')
  20. if len(numbers) != 8: return False
  21. for num in numbers:
  22. if not num: return False
  23. if len(num) >= 5: return False
  24. for n in num:
  25. if n not in valid16:
  26. return False
  27. return True

复杂度

  • 时间复杂度:468. 验证IP地址 - 图3468. 验证IP地址 - 图4是字符串长度。
  • 空间复杂度:468. 验证IP地址 - 图5,分割字符串需要额外的存储空间。

    总结

  1. 水题,不多说。

我是 @负雪明烛 ,刷算法题 1000 多道,写了 1000 多篇算法题解,收获阅读量 300 万。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。