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 xicannot 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 1:
Input: queryIP = "172.16.254.1"
Output: "IPv4"
Explanation: This is a valid IPv4 address, return "IPv4".
Example 2:
Input: queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
Output: "IPv6"
Explanation: This is a valid IPv6 address, return "IPv6".
Example 3:
Input: queryIP = "256.256.256.256"
Output: "Neither"
Explanation: This is neither a IPv4 address nor a IPv6 address.
Constraints:
queryIP consists only of English letters, digits and the characters '.' and ':'.
Solutions
Solution 1: Simulation
We can define two functions isIPv4 and isIPv6 to determine whether a string is a valid IPv4 address and IPv6 address.
The implementation of the function isIPv4 is as follows:
We first check if the string s ends with .. If so, s is not a valid IPv4 address, and we directly return false.
Then we split the string s by . into a string array ss. If the length of ss is not 4, s is not a valid IPv4 address, and we directly return false.
For each string t in the array ss, we check:
If the length of t is greater than 1 and the first character of t is 0, t is not a valid IPv4 address, and we directly return false.
If t is not a number or t is not in the range of 0 to 255, t is not a valid IPv4 address, and we directly return false.
If none of the above conditions are met, s is a valid IPv4 address, and we return true.
The implementation of the function isIPv6 is as follows:
We first check if the string s ends with :. If so, s is not a valid IPv6 address, and we directly return false.
Then we split the string s by : into a string array ss. If the length of ss is not 8, s is not a valid IPv6 address, and we directly return false.
For each string t in the array ss, we check:
If the length of t is less than 1 or greater than 4, t is not a valid IPv6 address, and we directly return false.
If the characters in t are not all between 0 and 9 and a and f (case insensitive), t is not a valid IPv6 address, and we directly return false.
If none of the above conditions are met, s is a valid IPv6 address, and we return true.
Finally, we call the isIPv4 and isIPv6 functions to determine if queryIP is a valid IPv4 address or IPv6 address. If it is neither, we return Neither.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Where \(n\) is the length of the string queryIP.