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

试题 历届试题 正则问题

                                                                                  蓝桥杯试题解答汇总链接

资源限制

       时间限制: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
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;
}

你可能感兴趣的:(蓝桥杯)