Leetcode468. 验证IP地址
Leetcode468. 验证IP地址
题目描述
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
- 如果是有效的 IPv4 地址,返回
"IPv4"
; - 如果是有效的 IPv6 地址,返回
"IPv6"
; - 如果不是上述类型的 IP 地址,返回
"Neither"
。
IPv4 地址由十进制数和点来表示,每个地址包含 4 个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1
;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01
是不合法的。
IPv6 地址由 8 组 16 进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334
是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334
也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334
是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334
是无效的。
示例 1:
1 | 输入:IP = "172.16.254.1" |
示例 2:
1 | 输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334" |
示例 3:
1 | 输入:IP = "256.256.256.256" |
示例 4:
1 | 输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334:" |
示例 5:
1 | 输入:IP = "1e1.4.5.6" |
提示:
IP
仅由英文字母,数字,字符'.'
和':'
组成。
解题思路
这道题思路上来说没有什么难的,主要在于corner case的处理。也就是说,磨时间总是能磨出来的。
总体的解题思路是,将IP
按照IPv4
或者IPv6
的格式分割,将分割成的每个小段用一个数组去存。然后对数组中的每一个元素去进行判断。
为了可读性,将整体划分为分割字符串的函数split
,验证是否为IPv4
的函数validIPV4Address
和验证是否为IPv6
的函数validIPV6Address
。
其中validIPV4Address
中对每一个元素的判断条件是:
1 | e == "" || (e.at(0) == '0' && e.size() > 1) || e < "0" || e > "255" || e.size() > 3 |
如果满足上述条件,那么一定不是IPv4
。
其中validIPV6Address
对每一个元素的判断条件是:
1 | e == "" || e.size() > 4 || e < "0" || e > "ffff" |
如果满足上述条件,那么一定不是IPv6
。
需要注意的是:
- 在分割字符串的时候,要对
..
或者::
这种形式的字符串进行处理的时候要在数组中加入元素""
,方便判断; - 由于
IPv6
中不区分大小写,为了方便后续的判断,直接把其中的大写字母全部转换成小写字母去进行判断;
详细细节见参考代码。
参考代码
1 | vector<string> split(const string &str, const char pattern) |
复杂度分析
时间复杂度为:
空间复杂度为: