·【蓝桥】·正则问题

题目来源: ·【蓝桥】·正则问题
本题可作为一道练习递归的例题~

问题描述
  考虑一种简单的正则表达式:
  只由 x ( ) | 组成的正则表达式。
  小明想求出这个正则表达式能接受的最长字符串的长度。
  例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
  一个由x()|组成的正则表达式。输入长度不超过100,保证合法。
输出格式
  这个正则表达式能接受的最长字符串的长度。
样例输入
((xx|xxx)x|(x|xx))xx
样例输出
6
数据规模和约定
  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms

题目分析
对于给定的字符串,只需利用|(或运算的性质)计算即可,连续的x累加长度
如输入样例: ((xx|xxx)x|(x|xx))xx
((2|3)1|(1|2))2 = (4|2)2 = 6
这是一个不错的练习递归的例题!

算法思想
pos从字符串下标为0处开始扫描,扫描完即可,每个(…)作为一层递归
switch(s[pos]){
case ‘(‘: 遇到(向下递归一层
case ‘x’: 连续的x累加长度,now++
case ‘|’: 更新一下ans,考虑到后面还有x,now=0
case ‘)’:更新一下ans,这一层递归结束
}

—————————————代码如下—————————————

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[105];
int pos = 0, len;
int solve(){
int ans = 0, now = 0;
while(pos < len){
if(s[pos] == '('){
pos++;
now += solve();
}
else if(s[pos] == 'x'){
pos++;
now++;
}
else if(s[pos] == '|'){
pos++;
ans = max(ans, now);
now = 0;
}
else{
pos++;
break;
}
}
ans = max(now, ans);
return ans;
}
int main(){
scanf("%s", s);
len = strlen(s);
printf("%d\n", solve());
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!