题目描述
编写一个函数来验证输入的字符串是否是有效的 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:
输入:IP = “172.16.254.1”
输出:“IPv4”
解释:有效的 IPv4 地址,返回 “IPv4”
示例 2:
输入:IP = “2001:0db8:85a3:0:0:8A2E:0370:7334”
输出:“IPv6”
解释:有效的 IPv6 地址,返回 “IPv6”
示例 3:
输入:IP = “256.256.256.256”
输出:“Neither”
解释:既不是 IPv4 地址,又不是 IPv6 地址
示例 4:
输入:IP = “2001:0db8:85a3:0:0:8A2E:0370:7334:”
输出:“Neither”
示例 5:
输入:IP = “1e1.4.5.6”
输出:“Neither”
提示:
IP 仅由英文字母,数字,字符 ‘.’ 和 ‘:’ 组成。
题解
提示的意思是不要考虑IPV6中可以缩写的情况。
牛客网上相应题目测试样例太少,会出现错误的程序被通过。因此在LeetCode上写吧。
本题目需要验证两种IP地址,两种IP地址的区分方式不一样,IPV4以‘ . ’区分,IPV6以‘ :’ 区分,
-
先考虑如果一个字符串中两种符号都出现了,这类的字符串不属于以上两种地址
-
首先需要实现Python中的split函数,以“.” “,” 为分割点,将字符串中的子串加入vector中,然后再做如下的判断,传入ip时尾部要加入相应的分割符
-
如果只找到“ .” 那么就要按照IPV4的方式判断
- 如果vector中的项数不等于4,不合法的
- 如果每一项的长度是空或者大于3,不合法的
- 如果每一项字符长度大于1且第一个字符为0,(有前导0)不合法的
- 如果每一项中字符的范围不在0-9也是不合法的
- 如果每一项转化为数字和大于255也是不合法的
-
如果只找到“ : ” 那么就要按照IPV6的方式判断
- 如果vector中的项数不等于8,不合法的
- 如果每一项的长度是空或者大于4,不合法的
- 如果每一项中字符的范围不在 0-9 或者不在 a-f 或者 A-F 也是不合法的
class Solution {
public:
vector<string> split(string ip,char t)
{
vector<string> res;
for(int i=0;i<ip.size();i++)
{
int j=i;
string items;
while(ip[j]!=t)
{
items+=ip[j];
j++;
}
i=j;
res.push_back(items);
}
return res;
}
string check_ipv4(string ip)
{
auto items=split(ip+'.','.');
if(items.size()!=4) return "Neither";
for(auto x:items)
{
if(x.empty()||x.size()>3) return "Neither";
if(x[0]=='0' && x.size()>1) return "Neither";
for(char c:x)
{
if(c<'0' ||c>'9') return "Neither";
}
int t=stoi(x);
if(t>255) return "Neither";
}
return "IPv4";
}
bool check(char c)
{
if(c>='0' &&c<='9') return true;
if(c>='a' &&c<='f') return true;
if(c>='A' &&c<='F') return true;
return false;
}
string check_ipv6(string ip)
{
auto items=split(ip+':',':');
if(items.size()!=8) return "Neither";
for(auto x:items)
{
if(x.empty()||x.size()>4) return "Neither";
for(auto c:x)
{
if(!check(c)) return "Neither";
}
}
return "IPv6";
}
string validIPAddress(string IP) {
if(IP.find(':')!=-1 &&IP.find('.')!=-1) return "Neither";
if(IP.find(':')!=-1) return check_ipv6(IP);
if(IP.find('.')!=-1) return check_ipv4(IP);
return "Neither";
}
};