if判断即可,保证输入字符正确,每组位数正确,每个IP组数正确,处理0和空串

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    string solve(string IP) {
        // write code here
        if (isIPV4(IP)) return "IPv4";
        IP.pop_back();
        if (isIPV6(IP)) return "IPv6";
        IP.pop_back();
        return "Neither";
    }

  private:
    bool isIPV4(string& IP) {
        IP += '.';
        int bitwise = 0;
        string str_num;
        for (auto& i : IP) {
            if (str_num.size() > 3) return false; //位数大于3
            if (i == '.' && !str_num.size()) return false; //开头为.,即空串
            if (i == '0' && !str_num.size()) return false; //十进制开头为0
            if (i != '.' && !isDEC(i)) return false; //不是十进制
            if (i == '.' && str_num.size() <= 3 &&
                    stoi(str_num) > 255) return false; //十进制数大于255

            if (i == '.' && str_num.size()) bitwise++, str_num = "";
            if (bitwise > 4) return false; //十进制数大于四个
            if (i != '.') str_num += i;
        }
        return true;
    }

    bool isIPV6(string& IP) {
        IP += ':';
        int bitwise = 0;
        string str_num;
        for (auto& i : IP) {
            if (str_num.size() > 4) return false; //位数大于4
            if (i == ':' && !str_num.size()) return false; //开头为:,即空串
            if (i != ':' && !isHEX(i)) return false; //不是十六进制

            if (i == ':' && str_num.size()) bitwise++, str_num = "";
            if (bitwise > 8) return false; //十六进制数组大于8个
            if (i != ':') str_num += i;
        }
        return true;
    }
    bool isDEC(char s) {
        return s >= '0' && s <= '9';
    }
    bool isHEX(char s) {
        return isDEC(s) || (s >= 'a' && s <= 'f') || (s >= 'A' && s <= 'F');
    }
};

时间复杂度:O(n)

空间复杂度:O(1)