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)