题意:
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。
规则如下:
方法:
模拟
思路:模拟。
首先,遍历字符串,初始判断是IPV4还是IPV6。如果是IPV4,错误的情况:某一段IP值超过 255 或含有前导 0 ;如果是IPV6,错误的情况:某一段IP的长度大于4或等于0 或 字符超过范围。
class Solution { public: string solve(string IP) { int len=IP.size(); int flag=0;//1表示IPV4,2表示IPV6,3表示失败 for(int i=0;i<len;i++){//判断是IPV4还是IPV6 if(IP[i]=='.'){ flag=1; break; }else if(IP[i]==':'){ flag=2; break; } } string s=""; int x=0; if(flag==1){//判断IPV4 for(int i=0;i<len;i++){ if(IP[i]=='.'){ if(x>255||s.size()>1&&s[0]=='0'){//如果超过255或含有前导0,则返回失败 flag=3; break; } x=0; s=""; }else{ s+=IP[i]; x=x*10+IP[i]-'0'; } } if(x>255||s.size()>1&&s[0]=='0'){//如果超过255或含有前导0,则返回失败 flag=3; } x=0; s=""; }else if(flag==2){//判断IPV6 for(int i=0;i<len;i++){ if(IP[i]==':'){ if(s.size()>4||s.size()==0){//如果某一段的长度大于4或等于0,则返回失败 flag=3; break; } s=""; }else{ s+=IP[i]; if(IP[i]>='g'&&IP[i]<='z'||IP[i]>='G'&&IP[i]<='Z'){//如果字符是超过范围,则返回失败 flag=3; break; } } } if(s.size()>4||s.size()==0){//如果某一段的长度大于4或等于0,则返回失败 flag=3; } s=""; } if(flag==1){ return "IPv4"; }else if(flag==2){ return "IPv6"; } return "Neither"; } };
时间复杂度:空间复杂度: