C语言实现 蓝桥杯 历届试题 正则问题

本文探讨了一种仅由x()|组成的简单正则表达式的解析方法,旨在找出该正则表达式所能接受的最长字符串长度。通过递归算法实现,详细解释了代码逻辑与递归出口,为理解正则表达式解析提供了一个实践案例。

试题 历届试题 正则问题

                                                                                  蓝桥杯试题解答汇总链接

资源限制

       时间限制: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Derrick-Xu

谢大哥打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值