这个题解答方式多种多样。本题解的一种思路,把IP按分隔符分割成字符串数组,然后对数组的每个元素挨个验证是否符合规则就行。时间复杂度O(N)。

public class Solution {
    public String solve (String IP) {
        if(IP.endsWith(".")||IP.endsWith(":"))return "Neither";
        boolean flag = IP.contains(".");//如果flag为真,则是IPV4的规则,否则就是IPV6的规则。
        String[] ips = flag?IP.split("\\."):IP.split(":");
        if(flag){
            if(ips.length!=4)return "Neither";//IPV4数组长度应该为4
            for(int i = 0 ; i < ips.length; ++i){
                if(ips[i].length()>1&&ips[i].startsWith("0"))return "Neither";
                int temp = 0 ;
                try{
                   temp =   Integer.parseInt(ips[i]);
                }
                catch(Exception e){
                    return "Neither";
                }
                finally{
                    if(temp>=256)return "Neither";//IPV4要求字符串组成的数组小于256.
                }
            }
            return "IPv4";
        }
        else {
            if(ips.length!=8)return "Neither";//IPV6字符串数组长度为8
            for(int i=0;i<ips.length;++i){
                if(ips[i].equals(""))return "Neither";//如果遇到空串,则说明肯定存在“::"这种场景,不符合要求
                if(judge(ips[i])){
                    continue;
                }
                else return "Neither";
            }
            return "IPv6";
        }
    }
    public boolean judge(String s1){//IPV6要求是16进制数,那么要判断字符串是否有其它字母,过滤掉。
        if(s1.length()>4)return false;
        for(int i=0;i<s1.length();++i){
            char c = s1.charAt(i);
            if(c>='0'&&c<='9'||c>='A'&&c<='F'||c>='a'&&c<='f')continue;
            else return false;
        }
        return true;
    }
}