题目的主要信息:
- 输入xx.xx.xx.xx形式的IPv4地址,判断其是否合法
方法一:字符串流输入输出
具体做法:
可以用字符串流输入输出将字符串转换成成数字和字符点,然后判断每个数字是否在0-255之间即可。
#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;
}
复杂度分析:
- 时间复杂度:,输入长度确定,属于常数时间
- 空间复杂度:,常数个变量,常数空间
方法二:正则表达式
具体做法:
也可以直接用正则匹配表达式来匹配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;
}
复杂度分析:
- 时间复杂度:,输入长度确定,属于常数时间
- 空间复杂度:,常数空间