试题 历届试题 正则问题
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出格式
这个正则表达式能接受的最长字符串的长度。
样例输入
((xx|xxx)x|(x|xx))xx
样例输出
6
数据规模与约定
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
备注
参考链接
使用了这位大佬的思路,但他的写的代码好像和蓝桥杯这个有点不搭嘎。
可能有人回有疑问递归的出口在哪里拿样本例子来解读一下,当括号内容全部结束时返回到第一个的dfs()的count+=dfs(),此时count=4;然后继续循环一直循环到ch=’\n’(getchat()会把回车当成一个字符读入)时候(此时count=6)进入if,else语句(比较max和count)返回最大值。
代码
#include<stdio.h>
int dfs(){
char ch;
int max=0,count=0;// max用来保存count用来记数
while(1){
ch=getchar();// 每次循环读取一个字符
if(ch=='x') count++;//
else if(ch=='|'){// 遇到|就保存|之前最大的长度并且计步器清0
max=(max>count)?max:count;
count=0;
}else if(ch=='(') count+=dfs();// 遇到(递归
else{// 遇到)就返回最大,最后一个字符为\n就是递归的出口
max=(max>count)?max:count;
printf("max=%d\n",max);
return max;
}
}
}
int main(){
printf("%d",dfs());
return 0;
}
本文探讨了一种仅由x()|组成的简单正则表达式的解析方法,旨在找出该正则表达式所能接受的最长字符串长度。通过递归算法实现,详细解释了代码逻辑与递归出口,为理解正则表达式解析提供了一个实践案例。

被折叠的 条评论
为什么被折叠?



