蓝桥杯每日一题1.9 2017省赛A组7.正则问题[DFS递归模仿栈]

3 篇文章 0 订阅

题目描述

http://oj.ecustacm.cn/problem.php?id=1321


  一种简单的正则表达式:只由 x ( ) | 组成的正则表达式。
  小明想求出这个正则表达式能接受的最长字符串的长度。
  例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6


解释:
  正则表达式,又称规则表达式,通常被用来检索、替换符合某个模式(规则)的文本。
  比如题目中由 x ( ) | 组成的正则表达式,括号“()”的优先级最高,或操作“|”次之。括号里面是一个整体,或的两边保留最长的一个。
   ((xx|xxx)x|(x|xx))xx是怎么执行的,为什么是6呢?
  先执行括号,再执行或, 步骤是:
  (1)先看第一个括号,发现里面还有嵌套括号,找到最内部的括号,括号内是一个或操作。((xx|xxx)x|(x|xx))xx,得:(xxxx|(x|xx))xx
  (2)继续执行最内部括号。(xxxx|(x|xx))xx,得:(xxxx|xx)xx
  (3)继续执行最后括号。(xxxx|xx)xx,得:xxxxxx,结束,得长度为6的字符串。
  正则表达式教程:https://www.runoob.com/regexp/regexp-tutorial.html,它自带测试工具。

题解:

https://blog.csdn.net/weixin_43914593/article/details/112363933

倪文迪的话:“这道题用递归的思路来做,代码还是相当简洁的。遇到左括号’(‘就去递归求解,遇到右括号’)‘则当前递归结束并返回结果;遇到’|‘则记录并重置当前的值,再向右计算更新;如果是x的话直接统计即可。”

while(pos < len){

        if(s[pos] == '('){   //左括号,继续递归。相当于进栈

            pos++;

            tmp += dfs();

        }else if(s[pos] == ')'){   //右括号,递归返回。相等于出栈

            pos++;

            break;

        }else if(s[pos] == '|'){   //检查或

            pos++;

            ans = max(ans, tmp);

            tmp = 0;

        }else{                     //检查X,并统计X的个数

            pos++;

            tmp++;

        }

    }

    ans = max(ans, tmp);

    return ans; 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 110000;

string s;
int pos=0;//字符串当前指针

int dfs()
{
    int maxx=0;
    int ans=0;
    int len=s.size();
    while(pos<len)
    {
        if(s[pos]=='(')
        {
            pos++;
            maxx+=dfs();//模仿入栈,继续递归
        }
        else if(s[pos]==')')
        {
            pos++;
            break;//模仿出栈,结束循环
        }
        else if(s[pos]=='|')
        {
            pos++;
            ans=max(ans,maxx);//取得最大X,为了统计|之后的X的数量,maxx清零
            maxx=0;
        }
        else if(s[pos]=='x')
        {
            pos++;
            maxx++;//统计X个数
        }
    }
    ans=max(ans,maxx);
    return ans;//返回本层递归最大X个数
}

int main()
{
    cin>>s;
    cout<<dfs();
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值