题目的主要信息:

  • 输入xx.xx.xx.xx形式的IPv4地址,判断其是否合法

方法一:字符串流输入输出

具体做法:

可以用字符串流输入输出将字符串转换成成数字和字符点,然后判断每个数字是否在0-255之间即可。

alt

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

int main(){
    string ip;
    while(getline(cin, ip)){
        stringstream ss;
        ss << ip;
        unsigned a, b, c, d;
        char c1, c2, c3; //接收点
        ss >> a >> c1 >> b >> c2 >> c >> c3 >> d; //流输出数组和字符
        //判断数字范围
        if(a >= 0 && a <= 255 && b >= 0 && b <= 255 && c >= 0 && c <= 255 && d >= 0 && d <= 255)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),输入长度确定,属于常数时间
  • 空间复杂度:O(1)O(1),常数个变量,常数空间

方法二:正则表达式

具体做法:

也可以直接用正则匹配表达式来匹配IP地址,为了方便,我们表达式直接是四个xx.的形式,因此匹配之前输入的字符串末尾要加一个点。

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

int main(){
    string ip;
    regex pattern("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\.){4}");//匹配0.0.0.0.-255.255.255.255.的正则表达式
    while(getline(cin, ip)){
        ip += "."; //正则表达式匹配的四个点,ip地址后面再加一个
        if(regex_match(ip, pattern)) //匹配函数
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),输入长度确定,属于常数时间
  • 空间复杂度:O(1)O(1),常数空间