【括号匹配】 括号画家
题意
输入一段由括号组成的字符串\(S\),定义以下形式的括号是美观的:
- 空的括号序列是美观的;
- 若括号序列
A
是美观的,则括号序列(A)、[A]、{A}
也是美观的; - 若括号序列
A、B
都是美观的,则括号序列AB
也是美观的。
例如 [(){}]()
是美观的括号序列,而)({)[}](
则不是。
求出连续最长的美观序列的长度
数据范围
\(1\leq |S| \leq 10^{5}\)
题解
栈中保存所有前括号的下标,扫描整个序列,因为右括号只能在右边,所以当当前的右括号且同栈中的下标对应字符串的括号是左括号的时候,当前下标出栈,
然后每次根据当前下标和栈中的下标进行匹配即可进行相应的更新即可
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
const int N=1e5+10;
int stk[N],cnt;
char s[N];
int ans=-1e5;
int main(){
scanf("%s",s);
int len=strlen(s);
rep(i,0,len){
char c=s[i];
if(c==')' && s[stk[cnt]] == '(') cnt--;
else if(c==']' && s[stk[cnt]] =='[') cnt--;
else if(c=='}' && s[stk[cnt]] == '{') cnt--;
else stk[++cnt] =i;
if(cnt) ans=max(ans,i-stk[cnt]);
else ans=max(ans,i+1);
}
printf("%d\n",ans);
}