题目的主要信息:

根据题目,我们判断ip地址是否合法,判断是否合法的检查标准是每段数字的范围在0-255。

方法一:

从字符串中提取出四段数字,然后判断每个数字是否在0-255之间,如果有一个数字越界了,那这个ip地址就是非法的。 alt 具体做法:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    string str;
    while(getline(cin,str))
    {
        stringstream ss(str);
        string temp;
        bool flag=true;
        int count=0;//用于统计部分数
        while(getline(ss,temp,'.'))
        {
            int num=atoi(temp.c_str());
            if((num!=0&&temp[0]=='0')||!isdigit(temp[0])){//每一部分不能含有其他符号
                flag=false;
            }else{
                if(num>255||num<0){
                flag=false;
                break;
                }
                count++;
            }
        }
        if(flag&&(count==4)) cout<<"YES"<<endl;//有四个部分且每一部分数字合法
        else cout<<"NO"<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),每检查一个ip地址,只判断四段数字的范围是否合法,只需常数时间。
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:

直接用正则表达式匹配。

具体做法:

#include<iostream>
#include<string>
#include<regex>
using namespace std;

int main(){
    string str;
    regex pattern("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\.){3}((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))");//匹配0.0.0.0-255.255.255.255的正则表达式
    while(getline(cin, str)){
        if(regex_match(str, pattern)){//正则表达式匹配成功
            cout << "YES" << endl;
        }else{
            cout << "NO" << endl;
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),用正则表达式匹配只需常数时间。
  • 空间复杂度:O(1)O(1),只用了常数空间。