LeetCode-Validate IP Address

https://leetcode-cn.com/problems/validate-ip-address

题目的意思是需要通过题目中给的条件去判断IP地址是否合法,需要判断的边界情况比较多,需要注意。这里采用的方法是尽量少记录状态,而尽量多在遍历中发现问题。

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
public:
bool valid_ipv4(string& IP) {
vector<int> ip_arr(4, 0);
int pos = 0;
for(int i=0; i<IP.size(); ++i) {
char c = IP[i];
if(c == '.') {
++pos;
if(pos > 3) return false;
if(i==0 || i==IP.size()-1) return false;
if(i<IP.size()-1 && i!=0 && IP[i+1]=='.') return false;
}else if (c == '0') {
if((i==0 || IP[i-1]=='.') && i<IP.size()-1 && IP[i+1]!='.') return false;
} else if(c >= '1' && c <= '9') {
ip_arr[pos] *= 10;
ip_arr[pos] += c-'0';
} else return false;
if(ip_arr[pos] > 255) return false;
}
if(pos != 3) return false;
return true;
}
bool valid_ipv6(string& IP) {
vector<int> ip_arr(8, 0);
int pos = 0;
int g_num = 0;
for(int i=0; i<IP.size(); ++i) {
char c = IP[i];
if(c == ':') {
++pos;
g_num = -1;
if(pos > 7) return false;
if(i<IP.size()-1 && IP[i+1]==':') return false;
} else if(c >= '0' && c <= '9') {
ip_arr[pos] *= 16;
ip_arr[pos] += c-'0';
} else if(c >= 'a' && c <= 'f') {
ip_arr[pos] *= 16;
ip_arr[pos] += c-'a'+10;
} else if(c >= 'A' && c <= 'f') {
ip_arr[pos] *= 16;
ip_arr[pos] += c-'A'+10;
} else return false;
++g_num;
if(g_num > 4) return false;
if(ip_arr[pos] > 65535) return false;
}
return true;
}
string validIPAddress(string IP) {
for(char c:IP) {
if(c == '.') {
if(valid_ipv4(IP)) return "IPv4";
break;
}
else if(c == ':') {
if(valid_ipv6(IP)) return "IPv6";
break;
}
}
return "Neither";
}
};