leetcode-华为专题-468. 验证IP地址

 

 

class Solution {
public:

    vector<string> split(string str, string flag){
        vector<string> res;
        int fd = 0;
        // 注意前面是赋值。fd = str.find(flag)
        // 后面是判断,如果fd == str.npos说明没找到
        while((fd=str.find(flag))&&fd!=str.npos){
            res.push_back(str.substr(0,fd)); // 从0开始截取fd个字符串
            str = str.substr(fd+1); // 更新str
        }
        res.push_back(str); // 加上最后还剩下的尾部
        return res;
    }
    string validIPAddress(string IP) {
        if(checkIPv4(IP)){
            return "IPv4";
        }else if(checkIPv6(IP))
            return "IPv6";
        else
            return "Neither";
    }
    bool checkIPv4(string IP){
        vector<string> IPv4str = split(IP,".");  // 按照点分割
        int len = IPv4str.size();
        if(len!=4)
            return false;
        for(auto s:IPv4str){
            if(s.empty()||s.size()==0||s.size()>3) // 为空,或者位数超过3 
                return false;
             // 判断每一位是不是数字
            for(auto str:s){
                cout<<"str1:"<<endl;
                if(!isdigit(str))
                    return false;
            }
            // 只有在上面判断完成是不会数字基础上,才能调用stoi
            if(to_string(stoi(s)).size()<s.size()) // 判断是否含有无效0
                return false;
    
            if(stoi(s)<0||stoi(s)>255) // 判断是不是超过int范围
                return false;
        }
        return true;
    }

    bool checkIPv6(string IP){
        vector<string> IPv6str = split(IP,":");  // 按照点分割
        int len = IPv6str.size();
        if(len!=8)
            return false;
        for(auto s:IPv6str){
            if(s.empty()||s.size()==0||s.size()>4) // 为空,或者位数超过4
                return false;
            for(char str:s){ // 对每一位范围判断
                if(!(isdigit(str)||str>='a'&&str<='f'))
                if(!(isdigit(str)||(str>='a'&&str<='f')||(str>='A'&&str<='F')))
                    return false;
            }

        }
        return true;
    }
};

 

posted @ 2021-08-17 20:39  三一一一317  阅读(47)  评论(0)    收藏  举报