题目要求
思路
1.字符串长度为0,或者既不满足ipv4也不满足ipv6的返回Neither
2.ipv4把字符串按照’.‘进行分割,将字符串存在数组s中,如果数组s不是4部分,说明有问题,如果s中的某一个字符串长度为0,则说明’.'号相连了,说明有问题,如果s中某一个字符串长度大于3或者小于0,说明有问题,如果s[i][0] == ‘0’ && s[i].size() != 1,说明存在前置0有问题,将字符串转换成数字,如果没在0-255之前,说明有问题
3.ipv6如果冒号相连,有问题,如果字符串没在a~f,A ~ F,0-9只中,说明有问题
代码实现
class Solution {
public:
string solve(string IP) {
if(IP.size() == 0)
return "Neither";
else if (ipv6(IP))
return "IPv6";
else if (ipv4(IP))
return "IPv4";
else
return "Neither";
}
bool ipv6(string ip)
{
// if(ip.length() < 15 || ip.length() > 39)
// return false;
vector<string> s = split(ip, ":");
if(s.size() != 8)
return false;
for(int i = 0; i < s.size(); i++)
{
//说明两个冒号相连
if(s[i].size() == 0 || s[i].size() > 4)
return false;
for(int j = 0; j < s[i].size(); j++)
{
if(!(isdigit(s[i][j]) || (s[i][j] >= 'A' && s[i][j] <= 'F') || (s[i][j] >= 'a' && s[i][j] <= 'f')))
return false;
}
// int num = stoi(s[i]);
// if(num == 0 && s[i].size() != 1)
// return false;
}
return true;
}
bool ipv4(string ip)
{
// if(ip.length() < 7 || ip.length() > 15)
// return false;
vector<string> s = split(ip, ".");
if(s.size() != 4)
return false;
for(int i = 0; i < s.size(); i++)
{
//说明两点相连
if(s[i].size() == 0)
return false;
if(s[i].size() < 0 || s[i].size() > 3 || (s[i][0] == '0' && s[i].size() != 1))
return false;
for(int j = 0; j < s[i].size(); j++)
{
//判断s[i][j]字符是否是十进制字符,如果是返回非0
if(!isdigit(s[i][j]))
return false;
}
int num = stoi(s[i]);
if(num < 0 || num > 255)
return false;
}
// cout << s[0] <<endl;
return true;
}
vector<string> split(string s, string spliter)
{
vector<string> res;
int i;
// cout << s.find(spliter) <<endl;
while((i = s.find(spliter)) && i != s.npos)
{
res.push_back(s.substr(0, i));
s = s.substr(i + 1);
}
res.push_back(s);
return res;
}
};