玩命加载中 . . .

468-验证IP地址


LeetCode 468. 验证IP地址

给定一个字符串 queryIP。如果是有效的 IPv4 地址,返回 "IPv4" ;如果是有效的 IPv6 地址,返回 "IPv6" ;如果不是上述类型的 IP 地址,返回 "Neither"

有效的IPv4地址“x1.x2.x3.x4” 形式的IP地址。 其中 0 <= xi <= 255xi 不能包含 前导零。例如: “192.168.1.1”“192.168.1.0” 为有效IPv4地址, “192.168.01.1” 为无效IPv4地址; “192.168.1.00”“192.168@1.1” 为无效IPv4地址。

一个有效的IPv6地址 是一个格式为“x1:x2:x3:x4:x5:x6:x7:x8” 的IP地址,其中:

  • 1 <= xi.length <= 4
  • xi 是一个 十六进制字符串 ,可以包含数字、小写英文字母( 'a''f' )和大写英文字母( 'A''F' )。
  • xi 中允许前导零。

例如 "2001:0db8:85a3:0000:0000:8a2e:0370:7334""2001:db8:85a3:0:0:8A2E:0370:7334" 是有效的 IPv6 地址,而 "2001:0db8:85a3::8A2E:037j:7334""02001:0db8:85a3:0000:0000:8a2e:0370:7334" 是无效的 IPv6 地址。

示例 1:

输入:queryIP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"

示例 2:

输入:queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"

method

split.或者:划分字符串,而且只划分4或8段

vector<string> split(string s, char ch, int limit) {
    int i = 0;
    int n = s.size();
    vector<string> res;
    while (i < n) {
        if (i < n && s[i] == ch) i++;	// 因为根据ch固定划分limit段,所以用if
        int start = i;
        while (i < n && s[i] != ch) i++;
        if (start < n) {
            if (limit-- > 1) {
                res.push_back(s.substr(start, i - start));
            } else {
                res.push_back(s.substr(start, n - start));
                break;
            }
        }
    }
    return res;
}
bool isIPv4(string s) {
    vector<string> strs = split(s,'.',4);
    if (strs.size() != 4) return false;
    for (auto s : strs) {
        if (s.size() > 3 || s.size() == 0) return false;
        if (s.size() > 1 && s[0] == '0') return false;	// 不能有前导0
        int num = 0;
        for (int i = 0; i < s.size(); i++) {
            if (!isdigit(s[i])) return false;	// 只能是数字
            num = num * 10 + s[i] - '0';
        }
        if (num > 255) return false;
    }
    return true;
}
bool isIPv6(string s) {
    vector<string> strs = split(s, ':', 8);
    if (strs.size() != 8) return false;
    for (auto s : strs) {
        if (s.size() > 4 || s.size() == 0) return false;	// 不能超过4个字符
        for (auto c : s) {
            if (!isdigit(c) && (tolower(c) < 'a' || tolower(c) > 'f')) return false;
        }
    }
    return true;
}
string validIPAddress(string queryIP) {
    if (isIPv4(queryIP)) return "IPv4";
    else if (isIPv6(queryIP)) return "IPv6";
    return "Neither";
}

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录