《算法竞赛进阶指南》括号画家

达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。

这一天,刚刚起床的达达画了一排括号序列,其中包含小括号 ( )、中括号 [ ] 和大括号 { },总长度为 NN。

这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的:

  1. 空的括号序列是美观的;
  2. 若括号序列 AA 是美观的,则括号序列 (A)(A)、[A][A]、{A}{A} 也是美观的;
  3. 若括号序列 A、BA、B 都是美观的,则括号序列 ABAB 也是美观的。

例如 [(){}]() 是美观的括号序列,而)({)[}]( 则不是。

现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子串是美观的,并且长度尽量大。

你能帮帮她吗?

输入格式

输入一行由括号组成的字符串。

输出格式

输出一个整数,表示最长的美观的子段的长度。

数据范围

字符串长度不超过 105105。

输入样例:

({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)

输出样例:

4

解题思路:
1:若遇到左括号就把他加到栈顶
2:若遇到右括号就查看该右括号是否与栈顶的左括号配对,若是配对,则将左括号删除,若不配对则加入栈顶
3:若该连续括号序列合法则栈里面必定为空 

#include <stack>
#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    string str;
    cin >> str;
    stack<int> stk;
    
    int res = 0;
    for (int i = 0; i < str.size(); i ++ )//当前枚举到哪个括号
    {
        if (stk.size())//如果当前栈里非空
        {
            int t = str[stk.top()];//若栈顶括号与当前枚举的括号配对,则删除栈顶元素
            if (t == '(' && str[i] == ')' || t == '[' && str[i] == ']' || t == '{' && str[i] == '}') stk.pop();
            else stk.push(i);//若不配对,则将当前枚举的括号加入
        }
        else stk.push(i);//若栈为空则直接加入概括好
        
        if (stk.size()) res = max(res, i - stk.top());//当前枚举的位置与栈顶的距离即为删除的元素的个数即连续括号的长度
        else res = max(res, i + 1);//否则栈顶为空说明之前枚举的所有的括号都合法,因为下标从0开始,所以要加1
    }
    
    cout << res << endl;
    
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啥也不会hh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值