达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。
这一天,刚刚起床的达达画了一排括号序列,其中包含小括号( )、中括号[ ]和大括号{ },总长度为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;
}