正则问题
题目链接
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
算法分析
我们采取递归搜索的方法,详情见代码
这里解释一下为什么在’’(’‘号中递归完毕后跳过")",是因为要保证在一个()中递归后保持括号匹配的位置.如果在")"的情况下k++,可能会连读两个dfs k的位置会多加,原因就是str[k]==’|'这个时候也进行了dfs在dfs内部dfs可能会多跳
代码实现
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
string str;
int k;
int dfs()
{
int res=0;
while(k<str.size())
{
if(str[k]=='(')
{
k++; //跳过(
res+=dfs();
k++; //跳过)
}
else if(str[k]=='x')
{
k++;
res++;
}
else if(str[k]=='|')
{
k++;
res=max(res,dfs());
}
else
break;
}
return res;
}
int main()
{
cin>>str;
cout<<dfs()<<endl;
return 0;
}