In this problem, your job to write a function to check whether a input string is a valid IPv4 address or IPv6 address or neither.

IPv4 addresses are canonically represented in dot-decimal notation, which consists of four decimal numbers, each ranging from 0 to 255, separated by dots (“.”), e.g.,`172.16.254.1`;

Besides, you need to keep in mind that leading zeros in the IPv4 is illegal. For example, the address `172.16.254.01` is illegal.

IPv6 addresses are represented as eight groups of four hexadecimal digits, each group representing 16 bits. The groups are separated by colons (“:”). For example, the address `2001:0db8:85a3:0000:0000:8a2e:0370:7334` is a legal one. Also, we could omit some leading zeros among four hexadecimal digits and some low-case characters in the address to upper-case ones, so `2001:db8:85a3:0:0:8A2E:0370:7334` is also a valid IPv6 address(Omit leading zeros and using upper cases).

However, we don’t replace a consecutive group of zero value with a single empty group using two consecutive colons (::) to pursue simplicity. For example, `2001:0db8:85a3::8A2E:0370:7334` is an invalid IPv6 address.

Besides, you need to keep in mind that extra leading zeros in the IPv6 is also illegal. For example, the address `02001:0db8:85a3:0000:0000:8a2e:0370:7334` is also illegal.

Note: You could assume there is no extra space in the test cases and there may some special characters in the input string.

Example 1:

``````Input: "172.16.254.1"

Output: "IPv4"

Explanation: This is a valid IPv4 address, return "IPv4".
``````

Example 2:

``````Input: "2001:0db8:85a3:0:0:8A2E:0370:7334"

Output: "IPv6"

Explanation: This is a valid IPv6 address, return "IPv6".
``````

Example 3:

``````Input: "256.256.256.256"

Output: "Neither"

``````

``````class Solution {
public:
istringstream is(IP);
string t = "";
int cnt = 0;
if (IP.find(':') == string::npos) { // Check IPv4
while (getline(is, t, '.')) {
++cnt;
if (cnt > 4 || t.empty() || (t.size() > 1 && t[0] == '0') || t.size() > 3) return "Neither";
for (char c : t) {
if (c < '0' || c > '9') return "Neither";
}
int val = stoi(t);
if (val < 0 || val > 255) return "Neither";
}
return (cnt == 4 && IP.back() != '.') ? "IPv4" : "Neither";
} else { // Check IPv6
while (getline(is, t, ':')) {
++cnt;
if (cnt > 8 || t.empty() || t.size() > 4) return "Neither";
for (char c : t) {
if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) return "Neither";
}
}
return (cnt == 8 && IP.back() != ':') ? "IPv6" : "Neither";
}
}
};
``````

https://discuss.leetcode.com/topic/71572/java-solution

https://discuss.leetcode.com/topic/71418/short-regexp-solution/5

LeetCode All in One 题目讲解汇总(持续更新中…)

 微信打赏 Venmo 打赏
（欢迎加入博主的知识星球，博主将及时答疑解惑，并分享刷题经验与总结，试运营期间前五十位可享受半价优惠～）

×

Help us with donation