【蓝桥杯】正则问题

正则问题

考虑一种简单的正则表达式:
只由 x ( ) ∣ x ( ) | x() 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。

例如 ( ( x x ∣ x x x ) x ∣ ( x ∣ x x ) ) x x ((xx|xxx)x|(x|xx))xx ((xxxxx)x(xxx))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 
#include 
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;
}

你可能感兴趣的:(蓝桥杯,深度优先,c++)