思路

这题没什么技巧也没什么算法,就是处理字符串...
IPv6的错误形式可能有如下:

  1. 多了0
  2. 出现::
  3. 字符不在0-9 a-f A-F之间

IPv4错误形式可能有如下:

  1. 多了首位'0'
  2. 超过0-255范围
  3. 出现的..

别的暂时没想到,有遗漏欢迎补充

class Solution {
public:
    bool type(string &s) {
        for(auto ch : s){
            if(ch == '.') return false;
            if(ch ==  ':') return true;
        }
    }

    bool checkv6(string &s) {
        int ch_cnt = 0;
        for(int i = 0; i < s.size(); ++i) {
            if(s[i] == ':') {
                if(ch_cnt > 4 || ch_cnt == 0) return false;
                ch_cnt = 0;
            } else if(!( s[i] <= '9' && s[i] >= '0' || 
                         s[i] <= 'f' && s[i] >= 'a' ||
                         s[i] <= 'F' && s[i] >= 'A'
                )) {
                return false;
            }            
            else {
                ch_cnt++;
            }
        }
        return true;
    }

    bool checkv4(string &s) {
        int k = 0; // 记录每个segment起始位置
        s.push_back('.'); // 方便atoi使用
        for(int i = 0; i < s.size(); ++i) {
            if(s[i] == '.') {
                s[i] = '\0'; // 方便atoi使用
                if(s[k] == '\0'|| (s[k] == '0' && atoi(&s[k]) != 0) ||
                   !(atoi(&s[k]) <= 255 && atoi(&s[k])>= 0)) {
                    return false;
                }
                k = i + 1;
            }
        }
        return true;
    }

    string solve(string IP) {
        // write code here
        if(type(IP)) {
            if(!checkv6(IP)) return "Neither";
            return "IPv6";
        } else {
            if(!checkv4(IP)) return "Neither";
            return "IPv4";
        }
    }
};