目录
题目
Description
给你一个字符串 和一个字符规律
,请你来实现一个支持
和
的正则表达式匹配。
-
匹配任意单个字符
-
匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 的,而不是部分字符串。
Format
Input
多组测试数据 每组数据一行,两个字符串 (长度小于
) 和
(长度小于
),
只包含小写字母,
包含小写字母以及
和
。
Output
每组数据输出一行,如果 能够匹配
,则输出
,否则输出
。
Samples
输入数据 1
aa a
aa aa
aa a.
aa b*aa
aa c*a.
aaaaab a*b
输出数据 1
No
Yes
Yes
Yes
Yes
Yes
Limitation
s,
KiB for each test case.
解法
这道题听上去很高大上
但事实上就三种
- .代表任意字符
- 字母+*代表任意个字母(你还会发现,.*不会出现???)
- 字母,直接匹配
是不是简单了许多?
先放张代码图压压惊
代码
#include<bits/stdc++.h>
using namespace std;
int nowp,nows;
char p[10007],s[10007];
bool k=1;
int main(){
while(~scanf("%s %s",&s,&p)){
nowp=nows=0;
k=1;
while(nowp<strlen(p)||nows<strlen(s)){
if(p[nowp+1]=='*'){
while(s[nows]==p[nowp]) nows++;
nowp+=2;
}
else if(p[nowp]=='.'){
nowp++;
nows++;
}
else{
if(p[nowp]!=s[nows]){
k=0;
break;
}
nowp++;
nows++;
}
}
if(nowp!=strlen(p)||nows!=strlen(s)) k=0;
if(k) printf("Yes\n");
else printf("No\n");
}
}
分解
我们一个一个来分解
.
.其实很简单,两个都跳过即可
nowp++;
nows++;
字母+*
这个就略微有点难度了
不过没有什么是一个循环搞不定的
如果有
那就
dfs!
不过此处只用一个循环即可
while(s[nows]==p[nowp]) nows++;
nowp+=2;
字母
这个更加简单了
直接判断即可
if(p[nowp]!=s[nows]){
k=0;
break;
}
nowp++;
nows++;
总结
此题要分开,
判断3不难。
字母会有错,
其他不用怕。
字*用循环,
.需两个+。
判断结束后,
需要来输出。
极差的打油诗 龟哥(扔袜子):你要不要脸