class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
// write code here
string ans = "Neither";
int n = IP.size();
// 字符穿首字符或末尾是'.'或':'则不符合;
if(IP.front()=='.' || IP.front()==':' || IP.back()=='.' || IP.back()==':')
return ans;
if(IP.find('.')!=string::npos && IP.find(':')==string::npos)
{
// 判断是否为有效IPv4
int i=0;
// 看看是不是只有四组
int flag = 0;
while(i<=n)
{
++flag;
int index = IP.find('.',i)!=string::npos ? IP.find('.',i) : n;
string str = IP.substr(i,index-i);
int str_len = str.size();
int str_num = stoi(str);
// 空的组、有0开头、超出范围、大于4组都不是有效IPv4
if(str.empty() || (str.front()=='0' && str_len>1) || (str_num<0 || str_num>255) || flag>4)
return ans;
// 确保str每个字符都是数字
for(auto t:str)
{
if(!isdigit(t))
{
return ans;
}
}
i = index+1;
}
ans = "IPv4";
}
else if(IP.find('.')==string::npos && IP.find(':')!=string::npos)
{
// 判断是否为有效IPv6
int i=0;
// 看看是不是只有8组
int flag = 0;
while(i<=n)
{
++flag;
int index = IP.find(':',i)!=string::npos ? IP.find(':',i) : n;
string str = IP.substr(i,index-i);
int str_len = str.size();
// 空的组、有0开头、超出范围、大于8组都不是有效IPv6
if(str.empty() || (str.front()=='0' && str_len>4) || flag>8)
return ans;
for(auto t:str)
{
if(t!='a' && t!='b' && t!='c' && t!='d' && t!='e' && t!='f' && t!='A' && t!='B' && t!='C' && t!='D' && t!='E' && t!='F' && (t-'0'<0 || t-'0'>9))
{
// cout << t << endl;
return ans;
}
}
i = index+1;
}
ans = "IPv6";
}
return ans;
}
};