问题描述
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
问题解释
一开始我还没看懂这个所谓的简单的正则表达式是什么东西 不过仔细分析就容易明白了
| :表示或的意思
() :表示结果为括号中的表达式
对于题目中的例题就是
((xx|xxx)x|(x|xx))xx = xxxxxx
1.(xx|xxx) = xxx
2.(xx|xxx)x = xxxx
3.(x|xx) = xx
4.(xx|xxx)x|(x|xx) = xxxx
5.((xx|xxx)x|(x|xx))xx = xxxxxx
问题分析
|:只需使用max()比较前后x个数的最大值即可
():遇到‘(’进行递归调用 计算()中最大的x长度即可
最终代码
#include <iostream>
#include <cstring>
using namespace std;
string s;
int idx = 0;
int fun(){
int len = 0;
while (idx < s.size()){
if (s[idx] == '('){
idx++;
len += fun();
}
else if (s[idx] == ')'){
idx++;
return len;
}
else if (s[idx] == '|'){
idx++;
len = max(len, fun());
return len;
}
else{
idx++;
len++;
}
}
return len;
}
int main(){
cin >> s;
cout << fun() << endl;
return 0;
}