題目描述:
达达是一名漫画家,她有一个奇特的爱好,就是在纸上画括号。
这一天,刚刚起床的达达画了一排括号序列,其中包含小括号( )、中括号[ ]和大括号{ },总长度为N。
这排随意绘制的括号序列显得杂乱无章,于是达达定义了什么样的括号序列是美观的:
(1) 空的括号序列是美观的;
(2) 若括号序列A是美观的,则括号序列 (A)、[A]、{A} 也是美观的;
(3) 若括号序列A、B都是美观的,则括号序列AB也是美观的。
例如 (){} 是美观的括号序列,而)({)[}]( 则不是。
现在达达想在她绘制的括号序列中,找出其中连续的一段,满足这段子序列是美观的,并且长度尽量大。
數據範圍:
字符串长度不超过100000。
解析:
思路1:在常見括號匹配的模板中,記錄一下棧的top值,找出距離最遠的相同的top值。
弊端:(}}}}}})不能很好避免。
正解:將右括號也加入棧,左括號入棧時記錄其在字符串中的位置,匹配成功時只需將左括號所在位和右括號所在位設為星號,最後統計最長星號連續長度即可
代碼:
#include<bits/stdc++.h> using namespace std; char s[100003],buf[100003]; int p[100003],ans,tp; bool is[100003]; int main() { scanf("%s",buf); int len=strlen(buf); for(int i=0;i<len;++i) { if(!tp) {s[++tp]=buf[i];p[tp]=i;} else switch(buf[i]) { case ')': if(s[tp]=='(') is[i]=is[p[tp--]]=1; else s[++tp]=buf[i]; break; case ']': if(s[tp]=='[') is[i]=is[p[tp--]]=1; else s[++tp]=buf[i]; break; case '}': if(s[tp]=='{') is[i]=is[p[tp--]]=1; else s[++tp]=buf[i]; break; default: s[++tp]=buf[i]; p[tp]=i; break; } } int ans=0,p=0; for(int i=0;i<len;++i) if(is[i]&&is[i+1]) ans=max(ans,++p); else p=0; if(ans) cout<<ans+1; else cout<<0; return 0; } //({({(({()}})}{())})})[){{{([)()((()]]}])[{)]}{[}{)转载于:https://www.cnblogs.com/tztqwq/p/11347424.html