O(n) time 这道题2001:0db8:85a3:00:000:8A2E:0370:7334 是合法的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 class Solution {public : string validIPAddress (string IP) { if (isIPv4(IP)) return "IPv4" ; else if (isIPv6(IP)) return "IPv6" ; return "Neither" ; } bool isIPv4 (const string &IP) { if (count(begin(IP), end(IP), '.' ) != 3 ) return false ; istringstream input (IP) ; string s; int cnt = 0 ; while (getline(input, s, '.' )) { try { int x = stoi(s); if (to_string(x) != s || x < 0 || x > 255 ) return false ; } catch (exception &e) { return false ; } ++cnt; } return cnt == 4 ; } bool isIPv6 (const string &IP) { if (count(begin(IP), end(IP), ':' ) != 7 ) return false ; istringstream input (IP) ; string s; int cnt = 0 ; while (getline(input, s, ':' )) { if (empty(s) || size(s) > 4 ) return false ; for (char c : s) { c = tolower (c); if (!('0' <= c && c <= '9' ) && !('a' <= c && c <= 'f' )) return false ; } ++cnt; } return cnt == 8 ; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 class Solution {public : string validIPAddress (string IP) { if (IP.empty() || IP.back() == '.' || IP.back() == ':' ) return "Neither" ; bool isv4 = false ; for (char c : IP) { if (isv4 = c == '.' ) break ; } char delimiter = isv4 ? '.' : ':' ; int cnt = 0 ; istringstream input (IP) ; string s; while (getline(input, s, delimiter)) { if (!isValid(s, isv4)) return "Neither" ; ++cnt; } if (isv4) { return cnt == 4 ? "IPv4" : "Neither" ; } else { return cnt == 8 ? "IPv6" : "Neither" ; } } bool isValid (const string &s, bool isv4) { if (isv4) { if (s.empty() || s.length() > 3 ) return false ; int x = 0 ; for (char c : s) { if (!isdigit (c)) return false ; x = x * 10 + c - '0' ; } return (s == "0" ) || (0 < x && x < 256 && s[0 ] != '0' ); } else { if (s.empty() || s.length() > 4 ) return false ; for (char c : s) { c = tolower (c); if (!('0' <= c && c <= '9' ) && !('a' <= c && c <= 'f' )) return false ; } return true ; } } };