首先将字符串IP中的每一段子串保存在数组vec中,然后判断格式正确与否,分为段数的判断、0的判断、值的判断。

class Solution {
public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    bool is_ipv4(string ip){
        for(auto& c: ip) if(c=='.') c=' ';
        vector<string> vec{};
        string str{};
        stringstream s_stream{ip};
        while(s_stream>>str) vec.push_back(str);
        if(vec.size()!=4) return false;
        for(auto x: vec){
            if(x[0]=='0' && x.size()>1) return false;
            if(stoi(x)>255) return false;
            for(auto c: x) if(!isdigit(c)) return false;
        }
        return true;
    }
    
    bool is_ipv6(string ip){
        for(auto& c: ip) if(c==':') c=' ';
        vector<string> vec{};
        string str{};
        stringstream s_stream{ip};
        while(s_stream>>str) vec.push_back(str);
        if(vec.size()!=8) return false;
        for(auto x: vec){
            char* endptr=nullptr;
            if(strtol(x.data(),&endptr,16)==0 && x.size()>1) return false;
            if(strtol(x.data(),&endptr,16)>0xffff) return false;
        }
        return true;
    }
    
    string solve(string IP) {
        if(is_ipv4(IP)) return "IPv4";
        else if(is_ipv6(IP)) return "IPv6";
        else return "Neither";
    }
};