题目描述
考虑一种简单的正则表达式:
只由 x
(
)
|
组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx
能接受的最长字符串是: xxxxxx
,长度是 6 6 6。
输入格式
一个由 x()|
组成的正则表达式。输入长度不超过 100 100 100,保证合法。
输出格式
这个正则表达式能接受的最长字符串的长度。
样例 #1
样例输入 #1
((xx|xxx)x|(x|xx))xx
样例输出 #1
6
提示
蓝桥杯 2022 省赛 A 组 G 题。
代码:
char s[200];
int len = 0, pos = 0;// 递归函数,用于计算正则表达式能接受的最长字符串的长度
int dfs() {int xCount = 0; // 记录当前连续出现的 'x' 的数量int maxCount = 0; // 记录最长的 'x' 的数量while (pos < len) {if (s[pos] == '(') { // 遇到左括号,递归处理括号内的表达式pos++;xCount += dfs();// 加上括号内的表达式的最长字符串的长度}else if (s[pos] == ')') { // 遇到右括号,结束当前递归pos++;break;}else if (s[pos] == '|') { // 遇到 '|',更新最长的 'x' 的数量,并重置当前计数pos++;maxCount = max(xCount, maxCount); // 将当前计数与最长的 'x' 的数量比较,取最大值xCount = 0;}else { // 遇到 'x',增加计数pos++;xCount++;}}// 更新最长的 'x' 的数量maxCount = max(xCount, maxCount);return maxCount;
}int main() {cin >> s; // 输入正则表达式字符串len = strlen(s); // 计算字符串长度int result = dfs(); // 计算最长字符串的长度cout << result << endl; // 输出结果return 0;
}