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

文章目录

    • 题目
    • 题目解析
    • 解题代码

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

题目

蓝桥杯历届试题 正则问题(非dfs解决)_第1张图片
oj平台

题目解析

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

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

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

总的来说就两个过程:

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

解题代码

效率尚可:蓝桥杯历届试题 正则问题(非dfs解决)_第2张图片

#include
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;
}

你可能感兴趣的:(Leetcode中级算法)