LeetCode 验证IP地址

题目要求: 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

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:

输入: "172.16.254.1"
输出: "IPv4"
解释: 这是一个有效的 IPv4 地址, 所以返回 "IPv4"。

示例 2:

输入: "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出: "IPv6"
解释: 这是一个有效的 IPv6 地址, 所以返回 "IPv6"。

示例 3:

输入: "256.256.256.256"
输出: "Neither"
解释: 这个地址既不是 IPv4 也不是 IPv6 地址。

思路分析:依据是否包含’.‘或者’:'来区分是否可能是IPv4或者IPv6,然后分开进行进一步的判断。

class Solution {
public:
    //判断是否是合法的IPv4
    bool isIPFour(string IP){
        int IPSize = IP.size(), index = 0, okStep = 0;//用于记录合法的段
        //扫描字符串,需要寻找到连续的4个合法的段
        while (index < IPSize){
            string tempStr = "";
            while (index < IPSize && IP[index] != '.'){
                //判断是否是数字
                if (isdigit(IP[index])){
                    tempStr += IP[index++];
                }
                else{
                    return false;
                }
            }
            //是否为空,长度大于1时,起始字符是否是'0'形如‘023’,或者是字符长度大于3,超过'255'
            if (tempStr.size() == 0 || (tempStr.size() > 1 && tempStr[0] == '0') || tempStr.size() > 3 || tempStr > "255"){
                return false;
            }
            okStep += 1;//合法的段自增
            index += 1;
        }
        return IP[index - 1] != '.' && okStep == 4;//IPv4有四个段
    }
    //判断是否是合法的IPv6
    bool isIPSix(string IP){
        int IPSize = IP.size(), index = 0, okStep = 0;//用于记录合法的段
        //扫描字符串,需要寻找到连续的8个合法的段
        while (index < IPSize){
            string tempStr = "";
            while (index < IPSize && IP[index] != ':'){
                //处理特例"20EE:FGb8:85a3:0:0:8A2E:0370:7334",出现大于'F'或者'f'的字符
                //数字、或者大写字母并且小于'G'、或者小写字母并且小于'g'
                if (isdigit(IP[index]) || (isupper(IP[index]) && IP[index] < 'G') || (islower(IP[index]) && IP[index] < 'g')){
                    tempStr += IP[index++];
                }
                else{
                    return false;
                }
            }
            //不能出现空段,或者段的长度超过4
            if (tempStr.size() == 0 || tempStr.size() > 4){
                return false;
            }
            okStep += 1;//合法的段自增
            index += 1;
        }
        //处理特例"2001:0db8:85a3:0:0:8A2E:0370:7334:",尾端多余':'
        return IP[index - 1] != ':' && okStep == 8;//IPv6有八个段
    }
    string validIPAddress(string IP) {
        //依据是否含有'.'或者':'特征字符区分4或6
        if (IP.find('.') != string::npos){
            //判断IPv4
            if (isIPFour(IP)){
                return "IPv4";
            }
            else{
                return "Neither";
            }
        }
        if (IP.find(':') != string::npos){
            //判断IPv6
            if (isIPSix(IP)){
                return "IPv6";
            }
            else{
                return "Neither";
            }
        }
        return "Neither";
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/88924296