题目描述:正则问题
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如((xx|xxx)x|(x|xx))xx
能接受的最长字符串是: xxxxxx
,长度是6。
输入:
一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出:
这个正则表达式能接受的最长字符串的长度。
例如,
输入:
((xx|xxx)x|(x|xx))xx
程序应该输出:
6
思路
题解给的思路特别棒,没看题解我做不出来(即使做出来也是写的很崩溃,本人蒻蒟,膜拜大佬)
题解是用递归解法,一对括号就是一次递归,((xx|xxx)x|(x|xx))xx
相当于(((xx|xxx)x|(x|xx))xx)
就是在前后方添加括号
当遇到|
时的处理特别巧妙(妙啊妙啊~)
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
char str[110];
int pos = 0;
int len;
int f(){
int tmp = 0,m=0;
while(pos<len){
if(str[pos]=='x'){
pos++;
tmp++;
}
else if(str[pos]=='|'){
pos++;
// 太妙了
m = max(m,tmp);
tmp=0;
}
else if(str[pos]=='('){
pos++;
// 递归返回之前的状态
tmp+=f();
}
else if(str[pos]==')'){
pos++;
m = max(m,tmp);
return m;
}
}
return max(m,tmp);//特别注意
}
int main(){
scanf("%s",str);
len = strlen(str);
int ans = f();
printf("%d",ans);
return 0;
}