【蓝桥杯】正则问题

这篇博客探讨了如何使用递归算法解决正则表达式所能接受的最长字符串长度问题。通过分析字符串中的x、(、)、|和∣字符,动态维护最大x数量,最终得出最长字符串的长度。示例给出了一个具体的正则表达式及其最长匹配的字符串长度为6。
摘要由CSDN通过智能技术生成

正则问题

考虑一种简单的正则表达式:
只由 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 <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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木又可可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值