问题 1887: [蓝桥杯][2017年第八届真题]正则问题
时间限制: 1Sec 内存限制: 128MB 提交: 125 解决: 38
题目描述
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出
这个正则表达式能接受的最长字符串的长度。
样例输入
((xx|xxx)x|(x|xx))xx
样例输出
6
解释:(x)x表示x+x
(x|xx)表示x或者xx
当遇到( 时,进入一个dfs
遇到 )时结束循环,比较|前后的值
遇到|时进行比较
遇到x时进行计数即可
#include<iostream> #include<cmath> #include<string> using namespace std; string a; int p; int dfs() { int ans=0; int result=0; int len=a.length(); while(p<len) { if(a[p]=='x') { p++; ans++; } else if(a[p]=='(') { p++; ans=ans+dfs(); } else if(a[p]==')') { p++; break; } else { p++; result=max(result,ans); ans=0; } } result=max(result,ans); return result ; } int main () { cin>>a; cout<<dfs(); return 0; }