真的这道题写吐了我
class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
if (IP.empty()) {
return "Neither";
}
split(IP);
if (is_ipv4()) {
return "IPv4";
} else if (is_ipv6()) {
return "IPv6";
} else {
return "Neither";
}
}
private:
void split(const std::string &s) {
int i = 0;
std::string tmp;
while (i < s.size()) {
int j = i;
while (j < s.size() && std::isalnum(s[j])) {
tmp += s[j];
++j;
}
res.push_back(tmp);
tmp.clear();
i = j + 1;
// 末尾分隔符 或者连续的分隔符
if (s[i] == ':' || s[i] == '.' || i == s.size() && !std::isalnum(s[j])) {
res.push_back("-1");
++i;
}
}
}
bool is_ipv4() {
if (res.size() != 4) {
return false;
}
for (int i = 0; i < res.size(); ++i) {
// 位数限制
if (res[i].empty() || res[i].size() > 3) {
return false;
}
// 内容限制
for (int j = 0; j < res[i].size(); ++j) {
if (!std::isdigit(res[i][j]) || res[i][0] == '0' && res[i].size() != 1) {
return false;
}
}
// 大小限制
if (std::stoi(res[i]) < 0 || std::stoi(res[i]) >255) {
return false;
}
}
return true;
}
bool is_ipv6() {
if (res.size() != 8) {
return false;
}
for (int i = 0; i < res.size(); ++i) {
// 位数限制
if (res[i].empty() || res[i].size() > 4) {
return false;
}
// 大小限制
for (int j = 0; j < res[i].size(); ++j) {
if (!(std::isdigit(res[i][j]) || res[i][j] <= 'f' && res[i][j] >= 'a' || res[i][j] >= 'A' && res[i][j] <= 'F')) {
return false;
}
}
}
return true;
}
private:
std::vector<std::string> res;
};