返回

深入解析LeetCode 468:验证IP地址的巧妙解法

后端

理解问题

LeetCode 468:验证IP地址 是一道模拟题,需要你检查一个给定的字符串是否符合IPv4或IPv6地址的格式。

IPv4地址由四个数字组成,每个数字都在0到255之间,数字之间由点号分隔。例如,"192.168.1.1"是一个有效的IPv4地址。

IPv6地址由八个十六进制数字组成,每个数字都在0到ffff之间,数字之间由冒号分隔。例如,"2001:0db8:85a3:0000:0000:8a2e:0370:7334"是一个有效的IPv6地址。

算法设计

为了验证一个字符串是否符合IPv4或IPv6地址的格式,我们可以按照以下步骤进行:

  1. 首先,我们需要检查字符串的长度是否符合IPv4或IPv6地址的格式。IPv4地址的长度为12,IPv6地址的长度为39。
  2. 接下来,我们需要检查字符串中是否包含任何非法字符。IPv4地址只能包含数字和点号,IPv6地址只能包含数字、字母和冒号。
  3. 然后,我们需要检查字符串中的数字是否都在允许的范围内。IPv4地址中的数字必须在0到255之间,IPv6地址中的数字必须在0到ffff之间。
  4. 最后,我们需要检查字符串中的点号或冒号是否在正确的位置。IPv4地址中的点号必须将字符串分成四个部分,IPv6地址中的冒号必须将字符串分成八个部分。

代码实现

def is_valid_ip_address(ip_address):
    """
    Checks if the given string is a valid IP address.

    Args:
        ip_address (str): The string to check.

    Returns:
        bool: True if the string is a valid IP address, False otherwise.
    """

    # Check the length of the string.
    if len(ip_address) != 12 and len(ip_address) != 39:
        return False

    # Check for illegal characters.
    for char in ip_address:
        if not (char.isdigit() or char in ".:"):
            return False

    # Split the string into parts.
    if len(ip_address) == 12:
        parts = ip_address.split(".")
    else:
        parts = ip_address.split(":")

    # Check the number of parts.
    if len(parts) != 4 and len(parts) != 8:
        return False

    # Check the values of the parts.
    for part in parts:
        if not part.isdigit():
            return False

        if len(part) == 0 or len(part) > 4:
            return False

        value = int(part)
        if value < 0 or value > 65535:
            return False

    # Check the positions of the dots or colons.
    if len(ip_address) == 12:
        for i in range(1, 4):
            if ip_address[i] != ".":
                return False
    else:
        for i in range(1, 8):
            if ip_address[i] != ":":
                return False

    # The string is a valid IP address.
    return True

复杂度分析

  • 时间复杂度:O(n),其中n是字符串的长度。
  • 空间复杂度:O(1),因为我们不需要额外的空间来存储数据。

总结

LeetCode 468:验证IP地址 是一道中等难度的模拟题,需要你检查一个给定的字符串是否符合IPv4或IPv6地址的格式。通过本文提供的清晰思路和详细的代码示例,相信你能轻松理解和解决这道题目,提升你的算法技能。