题解 AT1481 【カキ】
看见大家用的都是 find
函数,枚举等 string
基本操作,这里发一个正则表达式的做法。
首先,我们要了解一下正则表达式在 c++
中的定义以及其使用方法:
正则表达式是标准 c++11
中的一种常用与匹配两个字符串之间的数据结构,需要包含头文件 <regex>
,然后就可以声明某个正则表达式:
regex name(^value$); // 其中^与$均可省略,^代表开始,$代表结束
如:
regex reg("^abc+$");
那么我们刚才定义的 abc+
是什么意思呢?这要涉及到正则表达式的符号,这里介绍几种常用的:
1、+号
+号可以匹配其前面那个字符若干次(sjk+
就可以与 sjk
、sjkk
、sjkkk
等匹配。如果加号前面出现括号,则可以匹配括号中的内容若干次(
2、*号
*号可以匹配其前面那个字符若干次(
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
,系统早就帮你想好了,就不用担心了!
求赞
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)