蓝桥杯历届试题 正则问题(非dfs解决)

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯历届试题 正则问题(非dfs解决)相关的知识,希望对你有一定的参考价值。

题外话–网上清一色的 dfs 模拟也是够离谱,搁这一个接着一个抄呢?

题目


oj平台

题目解析

如果围绕着如何从左到右进行遍历更新那我觉得确实半天难以得到分数,但只要转念一想:

我们如果是处理没有括号的正则计数,会发现非常的容易,那么我们找到一种方法:

  1. 通过一个函数将一个括号范围内的正则表达式的最大值进行更新。
  2. 我们通过另一个函数将整个括号的表达式替换为对应的 x 数量。
  3. 不断重复1、2过程,处理完所有括号后,我们再次调用count计数即可得出答案。

总的来说就两个过程:

  • 计算无括号情况下的正则计数。
  • 构造等价简单正则表达式进行替换,然后去括号。

解题代码

效率尚可:

#include<bits/stdc++.h>
using namespace std;
vector<int>stk;
string s;

//处理无括号情况的计数函数
int count(int l,int r){
    int cnt = 0;
    int res = 0;
    while(l<r){
        if(s[l]=='x')
            cnt++;
        else if(s[l]=='|')
            cnt = 0;
        res = max(res,cnt);
        l++;
    }
    return res;
}
//替换等价正则操作
void solve(int l,int r){
    int len = count(l+1,r);
    string x(len,'x');
    s.replace(l,(r-l)+1,x);
}

int main(){
    cin>>s;
    int i = 0;
   	//不断去括号,直到无括号为止
    while(i<s.size()){
        if(s[i]=='(')
            stk.push_back(i);
        //处理一对括号里面的东西
        else if(s[i]==')'){
            solve(stk.back(),i);
            stk.pop_back();
            if(!stk.empty())
                i = stk.back()+1;
            else i = 0;
            continue;
        }
        i++;
    }
    int res = count(0,s.size()+1);
    cout<<res;
}

以上是关于蓝桥杯历届试题 正则问题(非dfs解决)的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯练习系统历届试题 带分数 dfs

蓝桥杯 - 带分数 (DFS)

蓝桥杯 地宫寻宝 带缓存的DFS

蓝桥杯历届试题:牌型种数

蓝桥杯单片机自锁怎么解决

[蓝桥杯][历届试题]打印十字图