标签:一段 color span 长度 子序列 long syn pre har
# 题意
一共有3种括号,空的括号是美观的
(1) 空的括号序列是美观的;
(2) 若括号序列A是美观的,则括号序列 (A)、[A]、{A} 也是美观的;
(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的。
例如 [(){}]() 是美观的括号序列,而)({)[}]( 则不是。
现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。
# 题解
栈中保存前括号的下标,扫描,匹配上时出栈,不匹配跳过,若栈不空,用当前下标减栈中中标,因为当前未匹配入展,所以不合法减去即可,所得为0,否则即匹配减去未匹配即当前已匹配的最大长度
若栈空说明此符号前都被匹配,用当前到该下标所有长度更新
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int N = 1e5+10; 5 int idx,stk[N]; 6 int ans; 7 string str; 8 int main(){ 9 ios::sync_with_stdio(0); 10 cin.tie(0); 11 cout.tie(0); 12 cin>>str; 13 for(int i = 0; i < str.size(); i++){ 14 char c = str[i]; 15 if (c == ‘)‘ && str[stk[idx]] == ‘(‘) idx--; 16 else if (c == ‘]‘ && str[stk[idx]] == ‘[‘) idx--; 17 else if (c == ‘}‘ && str[stk[idx]] == ‘{‘) idx--; 18 else stk[++idx]=i; 19 20 if(idx) ans = max(ans , i - stk[idx]); 21 else ans = max(ans , i + 1); 22 } 23 cout<<ans; 24 }
标签:一段 color span 长度 子序列 long syn pre har
原文地址:https://www.cnblogs.com/hhyx/p/12495696.html