题目描述
考虑一种简单的正则表达式:只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6
输入
输入一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出
输出这个正则表达式能接受的最长字符串的长度。
样例输入
((xx|xxx)x|(x|xx))xx
样例输出
6
【想说的】(要命,练了这么久,基本递归想不出,好想敲shi自己)好好思考昂
这题目递归去写,分而治之?
先定义两个变量,maxx记录()目前最大的串,cnt记录由‘|’分组的情况
遍历整个字符串,遇到左括号,象征新的一轮要开始,就要递归了;遇到‘|’,开始作比较,更新maxx的值;遇到’x’老老实实cnt++下一个;遇到右括号就结束了循环,把括号里的数字返回去。
(仔细体会一下)
代码
#include <bits/stdc++.h>
using namespace std;
int k=0;//遍历的下标
string a;
int cal()
{
int maxx=0;
int cnt=0;
int l=a.length();
while(k<l)
{
if(a[k]=='(')
{
k++;
cnt+=cal();
}
else if(a[k]==')')
{
k++;
break;
}
else if(a[k]=='|')
{
k++;
maxx=max(maxx,cnt);
cnt=0;
}
else{
k++;
cnt++;
}
}
return max(maxx,cnt);
}
int main()
{
cin>>a;
cout<<cal()<<endl;
}