leetcode 468. 验证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:
输入: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";
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值