LeetCode 468. Validate IP Address

Post by ailswan Apr. 26, 2024

468. Validate IP Address

Problem Statement

link: LeetCode.cn LeetCode Given a string queryIP, return “IPv4” if IP is a valid IPv4 address, “IPv6” if IP is a valid IPv6 address or “Neither” if IP is not a correct IP of any type.

A valid IPv4 address is an IP in the form “x1.x2.x3.x4” where 0 <= xi <= 255 and xi cannot contain leading zeros. For example, “192.168.1.1” and “192.168.1.0” are valid IPv4 addresses while “192.168.01.1”, “192.168.1.00”, and “192.168@1.1” are invalid IPv4 addresses.

A valid IPv6 address is an IP in the form “x1:x2:x3:x4:x5:x6:x7:x8” where:

1 <= xi.length <= 4 xi is a hexadecimal string which may contain digits, lowercase English letter (‘a’ to ‘f’) and upper-case English letters (‘A’ to ‘F’). Leading zeros are allowed in xi. For example, “2001:0db8:85a3:0000:0000:8a2e:0370:7334” and “2001:db8:85a3:0:0:8A2E:0370:7334” are valid IPv6 addresses, while “2001:0db8:85a3::8A2E:037j:7334” and “02001:0db8:85a3:0000:0000:8a2e:0370:7334” are invalid IPv6 addresses.

Example:

Input: root = [3,5,1,6,2,0,8,null,null,7,4] Output: [2,7,4]

Input: root = [1] Output: [1]

Input: root = [0,1,3,null,2] Output: [2]

Solution Approach

The solution validates whether the given IP address is IPv4, IPv6, or neither by splitting the address based on “.” for IPv4 and “:” for IPv6, then checking the validity of each part according to the respective criteria.

Algorithm

Implement

    class Solution:
    def validIPAddress(self, queryIP: str) -> str:
        def isIPv4(ip):
            for p in ip:
                if not p or (p[0] == "0" and len(p) > 1) or not p.isdigit() or int(p) > 255:
                    return "Neither"
            return "IPv4"
        
        def isIPv6(ip):
            for p in ip:
                if len(p) > 4 or len(p) < 1 or not all(c.isdigit() or c.lower() in 'abcdef' for c in p):
                    return "Neither"
            return "IPv6"

        ip = queryIP.split(":")
        if len(ip) == 8:
            return isIPv6(ip)
        ip = queryIP.split(".")
        if len(ip) == 4:
            return isIPv4(ip)

        return "Neither"