字符串递归-第八届蓝桥杯省赛C++A组-正则问题

字符串递归-第八届蓝桥杯省赛C++A组-正则问题

题目:

考虑一种简单的正则表达式:

只由 x ( ) | 组成的正则表达式。

小明想求出这个正则表达式能接受的最长字符串的长度。

例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。

输入格式
一个由x()|组成的正则表达式。

输出格式
输出所给正则表达式能接受的最长字符串的长度。

数据范围
输入长度不超过100,保证合法。

输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6

题意:

对 表 达 式 ( ( x x ∣ x x x ) x ∣ ( x ∣ x x ) ) x x 而 言 , ′ ∣ ′ 表 示 取 左 右 两 边 较 大 的 长 度 , 如 x x ∣ x x x = x x x ; ′ ( ) ′ 改 变 优 先 级 。 对表达式((xx|xxx)x|(x|xx))xx而言,'|'表示取左右两边较大的长度,如xx|xxx=xxx;'()'改变优先级。 ((xxxxx)x(xxx))xxxxxxx=xxx()

那 么 ( ( x x ∣ x x x ) x ∣ ( x ∣ x x ) ) x x = ( x x x x ∣ ( x ∣ x x ) ) x x = ( x x x x ∣ x x ) x x = ( x x x x ) x x = x x x x x x 。 长 度 为 6 。 那么((xx|xxx)x|(x|xx))xx=(xxxx|(x|xx))xx=(xxxx|xx)xx=(xxxx)xx=xxxxxx。长度为6。 ((xxxxx)x(xxx))xx=(xxxx(xxx))xx=(xxxxxx)xx=(xxxx)xx=xxxxxx6

题解:

递 归 搜 索 树 : 递归搜索树:

′ ( ′ 和 ′ ∣ ′ 后 面 都 是 表 达 式 , 所 以 每 次 遇 到 ′ ( ′ 和 ′ ∣ ′ 就 往 下 递 归 一 层 。 '('和'|'后面都是表达式,所以每次遇到'('和'|'就往下递归一层。 ((
在这里插入图片描述


代码:

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
int k;  ///遍历字符串的指针
string str;

int dfs()///计算连续的x的个数
{
    int res=0;
    while(k<str.size())
    {
        if(str[k]=='(')
        {
            k++;   ///跳过'('
            res+=dfs();   ///dfs到')'退出后k++跳过'('
            k++;
        }
        else if(str[k]=='|')
        {
            k++;   ///跳过'|'
            res=max(res,dfs());  ///左边与右边的最大值
        }
        else if(str[k]==')')
        {
            //k++;   
            ///这里k++应该在左括号里完成,否则会重复计算
            break;
        }
        else
        {
            res++;  ///增加一个x
            k++;   ///指针移动
        }
    }
    return res;
}


int main()
{
    cin>>str;
    cout<<dfs()<<endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值