2017第八届蓝桥杯省赛-大学A组 正则问题(字符串处理,dfs)

描述
考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出
这个正则表达式能接受的最长字符串的长度。
输入
((xx|xxx)x|(x|xx))xx
输出
6
资源约定
峰值内存消耗(含虚拟机) < 256M CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
注意: main函数需要返回0; 只使用ANSI C/ANSI C++ 标准; 不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include 不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。

思路:猜了半天,总算看懂什么是 这里的 | 运算,是什么意思。取出|之前之后的最长的字符串。括号和其他运算的括号的意思一样。

然后分析一下怎么实现这个过程。从前向后遍历。遇到(之后,进入dfs,遇到)之后跳出dfs,遇到x,统计x的数字。遇到 | 就比较大小。

看一下代码实现:

#include
#include
#include
using namespace std;
char s[200];
int len = 0,pos = 0; 
int dfs(){
	int xnum = 0;
	int maxx = 0;
	while(pos < len){
		if(s[pos] == '('){
			pos++;
			xnum += dfs();
		}
		else if(s[pos] == ')'){
			pos++;
			break;	
		}
		else if(s[pos] == '|'){
			pos++;
			maxx = max(xnum,maxx);
			xnum = 0;
		}
		else {
			pos++;
			xnum ++;
		}
	}
	maxx = max(xnum,maxx);
	return maxx;
}
int main(){
	cin >> s;
	len = strlen(s);
	int ans = 0;
	ans = dfs();
	printf("%d\n",ans);
}


你可能感兴趣的:(2017第八届蓝桥杯省赛-大学A组 正则问题(字符串处理,dfs))