括号画家

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

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

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

(1) 空的括号序列是美观的;

(2) 若括号序列A是美观的,则括号序列 (A)、[A]、{A} 也是美观的;

(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的。

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

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

你能帮帮她吗?

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

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

数据范围
字符串长度不超过100000。

输入样例:
({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)
输出样例:
4

本题的解法就是运用栈来解决。首先建立一个栈,然后开始遍历字符串,将字符串添加进栈,然后判断即将要添加的字符是否和当前栈顶的字符串是一对,要是一对就将他们删除,不是一对就将要添加的加进去。在这里向栈里添加的并不是字符串,而是字符串的位置。最后判断每一个字符i与栈顶的差值,就是美观字符串的长度

#include<iostream>
#include<stack>
#include<cstring>
using namespace std;

int main()
{
	string str;
	cin>>str;
	stack<int >stk;//建立一个栈
	int res=0;//记录长度
	for(int i=0;i<str.size() ;i++)//遍历每一个字符
	{
		char c=str[i];
		if(stk.size() ){//如果栈不为空
			char t=str[stk.top() ];//取栈顶元素
		if(c==')'&&t=='('||c==']'&&t=='['||c=='}'&&t=='{')//判断是否能够配对
		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);
	
	}
	cout << res << endl;
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值