if判断即可,保证输入字符正确,每组位数正确,每个IP组数正确,处理0和空串
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
string solve(string IP) {
// write code here
if (isIPV4(IP)) return "IPv4";
IP.pop_back();
if (isIPV6(IP)) return "IPv6";
IP.pop_back();
return "Neither";
}
private:
bool isIPV4(string& IP) {
IP += '.';
int bitwise = 0;
string str_num;
for (auto& i : IP) {
if (str_num.size() > 3) return false; //位数大于3
if (i == '.' && !str_num.size()) return false; //开头为.,即空串
if (i == '0' && !str_num.size()) return false; //十进制开头为0
if (i != '.' && !isDEC(i)) return false; //不是十进制
if (i == '.' && str_num.size() <= 3 &&
stoi(str_num) > 255) return false; //十进制数大于255
if (i == '.' && str_num.size()) bitwise++, str_num = "";
if (bitwise > 4) return false; //十进制数大于四个
if (i != '.') str_num += i;
}
return true;
}
bool isIPV6(string& IP) {
IP += ':';
int bitwise = 0;
string str_num;
for (auto& i : IP) {
if (str_num.size() > 4) return false; //位数大于4
if (i == ':' && !str_num.size()) return false; //开头为:,即空串
if (i != ':' && !isHEX(i)) return false; //不是十六进制
if (i == ':' && str_num.size()) bitwise++, str_num = "";
if (bitwise > 8) return false; //十六进制数组大于8个
if (i != ':') str_num += i;
}
return true;
}
bool isDEC(char s) {
return s >= '0' && s <= '9';
}
bool isHEX(char s) {
return isDEC(s) || (s >= 'a' && s <= 'f') || (s >= 'A' && s <= 'F');
}
};
时间复杂度:O(n)
空间复杂度:O(1)

京公网安备 11010502036488号