题解 AT1481 【カキ】
看见大家用的都是 find 函数,枚举等 string 基本操作,这里发一个正则表达式的做法。
首先,我们要了解一下正则表达式在 c++ 中的定义以及其使用方法:
正则表达式是标准 c++11 中的一种常用与匹配两个字符串之间的数据结构,需要包含头文件 <regex>,然后就可以声明某个正则表达式:
regex name(^value$); // 其中^与$均可省略,^代表开始,$代表结束
如:
regex reg("^abc+$");
那么我们刚才定义的 abc+ 是什么意思呢?这要涉及到正则表达式的符号,这里介绍几种常用的:
1、+号
+号可以匹配其前面那个字符若干次(),如 sjk+ 就可以与 sjk、sjkk、sjkkk 等匹配。如果加号前面出现括号,则可以匹配括号中的内容若干次()。
2、*号
*号可以匹配其前面那个字符若干次(),与+号不同的就在于0次也可以匹配。
3、[a-z]
代表所有小写字母。
4、[A-Z]
代表所有大写字母。
5、[0-9]
代表所有阿拉伯数字。
6、?号
?号代表其前面的字符可出现也可以不出现,若前面有括号,则代表括号内内容可出现也可以不出现,如 (ak)?ioi 可以与 ioi 和 akioi 成功匹配。
那么知道了定义方式和其基础符号,我们还要学习基本匹配函数 regex_match,这个函数可以有两或三个参数,常为两个参数,第一个参数是待匹配的字符串,第二个是一个正则表达式,返回值为布尔类型,如匹配成功返回 true,匹配失败返回 false。
学习完这些,这道题目不是迎刃而解了?
代码:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
regex reg("^([a-z]+)?r([a-z]+)?$");
string s; int cnt = 0;
ios::sync_with_stdio(false);
for(register int i = 1; i <= 12; i++)
{
cin >> s;
cnt += regex_match(s, reg);
}
cout << cnt << endl;
return 0;
}
这里重点说一下代码中定义的正则表达式:
因为题目说都是小写,那我们就写 [a-z],但是不只是一个字符,我们写一个 [a-z]+。但是有个问题!如果根本没有这些字符,直接出现r,那怎么办?所以我们加上 ?,并且把前面加上括号,然后写 r,后面也是同理。
但是 regex_match 匹配到 r 时不还是小写字母 [a-z] 中的一个吗?怎么跳到 r,系统早就帮你想好了,就不用担心了!

浙公网安备 33010602011771号