正则问题
考虑一种简单的正则表达式:
只由
x
(
)
∣
x ( ) |
x()∣ 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如
(
(
x
x
∣
x
x
x
)
x
∣
(
x
∣
x
x
)
)
x
x
((xx|xxx)x|(x|xx))xx
((xx∣xxx)x∣(x∣xx))xx 能接受的最长字符串是:
x
x
x
x
x
x
xxxxxx
xxxxxx,长度是
6
6
6。
输入格式
一个由
x
(
)
∣
x()|
x()∣ 组成的正则表达式。输入长度不超过
100
100
100,保证合法。
输出格式
这个正则表达式能接受的最长字符串的长度。
例如,
输入格式
((xx|xxx)x|(x|xx))xx
程序应该输出:
6
思路
- 递归
- 分四种情况
- 设置两个临时变量,一个向前走,记录 x x x 的个数,一个只有当遇到 ∣ | ∣ 或者 ) ) ) 时才会更新,保存最大 x x x 的数量
- 设定全局变量指示位置,遍历一遍字符串,当所在位置分别为
x
,
(
,
)
,
∣
x,(,),|
x,(,),∣时,做不同操作:
- s t r [ p o s ] = = x str[pos]==x str[pos]==x:记录x个数的变量加一
- s t r [ p o s ] = = ( str[pos]==( str[pos]==(:递归
- s t r [ p o s ] = = ) str[pos]==) str[pos]==):更新最大数量,并且返回这个最大值到递归的上一层
- s t r [ p o s ] = = ∣ str[pos]==| str[pos]==∣:将记录最大数量的变量更新为 m a x ( 最 大 变 量 的 值 , x 的 数 量 ) max(最大变量的值,x的数量) max(最大变量的值,x的数量),并且将记录 x x x 个数的变量置为0,以进一步地计算下一段字符串中 x x x 的数量
- 以上每一步操作都有位置指针的加一
代码如下
#include <cstring>
#include <iostream>
using namespace std;
char str[105];
int pos;//位置指针
int len;//字符串长度
int dfs() {
int tmp = 0, tmax = 0;//记录x数量的变量以及记录最大x数量的变量
while (pos < len) {
if (str[pos] == '(') {
pos++;
tmp += dfs();
} else if (str[pos] == '|') {
tmax = max(tmax, tmp);
tmp = 0;
} else if (str[pos] == ')') {
tmax = max(tmax, tmp);
return tmax;
} else if (str[pos] == 'x') {
tmp++;
}
pos++;
}
tmax = max(tmax, tmp);//返回到最外层后,还要更新一次最大数量
return tmax;//此时的最大数量就是答案
}
void solve() {
scanf("%s", str);
len = strlen(str);
int ans = dfs();
printf("%d\n", ans);
}
int main(void) {
solve();
return 0;
}