Validate IP Address

现规定两种IP地址,分别为IPV4和IPV6。IPV4由4个10进制数(0~255)组成,只允许有单独的0出现,数字之间用“.”分隔;

IPV6用8个16进制组成,每个数的长度最多不超过4,允许单独的0出现,数字之间用“:”分隔。

Input: "172.16.254.1"

Output: "IPv4"

Explanation: This is a valid IPv4 address, return "IPv4".
Input: "2001:0db8:85a3:0:0:8A2E:0370:7334"

Output: "IPv6"

Explanation: This is a valid IPv6 address, return "IPv6".

部分思路:

1.首先确定开头不能为标点;

2.“.”则不能出现“:”;

3.IPV4有4个“.”;

4.IPV4不能出现字母

5.IPV4的数字长度小于4

自己想的思路时间复杂度太高,在discuss找的几个方法的时间复杂度也是太高。

class Solution {
private:
    bool validIPv4(string &IP) {
        int begin = 0, end = 0, cnt = 0;
        while (end < IP.size()) {
            int leadingZeroCount = 0, num = 0;
            while (end < IP.size() && isdigit(IP[end])) {
                num = num * 10 + IP[end] - '0';
                if (IP[end] == '0' && num == 0) leadingZeroCount++;
                if ((leadingZeroCount > 0 && num != 0)
                || leadingZeroCount > 1
                || end - begin + 1 > 3
                || num > 255) return false;
                ++end;
            }
            if (end == begin) return false;
            ++cnt;
            if (cnt <= 3) {
                if (end >= IP.size() || IP[end] != '.') return false;
                begin = ++end;
            } else {
                if (end != IP.size()) return false;
            }
        }
        return cnt == 4;
    }
    
    bool validIPv6(string &IP) {
        int cnt = 0, begin = 0, end = 0;
        while (end < IP.size()) {
            while (end < IP.size() && isalnum(IP[end])) {
                if ((IP[end] > 'f' && IP[end] <= 'z')
                || (IP[end] > 'F' && IP[end] <= 'Z')
                || end - begin + 1 > 4) return false;
                ++end;
            }
            if (begin == end) return false;
            ++cnt;
            if (cnt <= 7) {
                if (end >= IP.size() || IP[end] != ':') return false;
                begin = ++end;
            } else {
                if (end != IP.size()) return false;
            }
        }
        return cnt == 8;
    }
public:
    string validIPAddress(string IP) {
        if (validIPv4(IP)) return "IPv4";
        if (validIPv6(IP)) return "IPv6";
        return "Neither";
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值