喵哈哈村的括号序列
发布时间: 2017年2月21日 20:05 最后更新: 2017年2月21日 20:07 时间限制: 1000ms 内存限制: 128M
喵哈哈村的括号序列和外界的括号序列实际上是一样的。
众所周知"()"这样的,就是一个标准的括号序列;"()()()()"这样也是括号序列;“((()))()”这样也是一个合法的括号序列。但是"((("这样,就不是一个合法的括号序列了。
现在沈宝宝非常好奇,给你一个字符串,请从中找出最长的合法括号序列出来。
不知道你能找到吗?
第一行一个T,表示有T组数据。
接下来T行,每一行都是一个字符串。
保证字符串的长度小于100000。
而且字符串中保证只会出现"(",")"这两种字符之一。
1<=T<=10
对于每一组测试数据,输出最长的合法括号序列的长度。
复制
2
)((())))(()())
)(
6
0
用个stack就行了,注意一些特殊情况。
1 #include <iostream> 2 #include <string.h> 3 #include <stack> 4 #include <stdio.h> 5 #define N 100005 6 using namespace std; 7 char k[N]; 8 int ans[N]; 9 int main(){ 10 int n; 11 cin>>n; 12 while(n--){ 13 memset(k,0,sizeof(k)); 14 memset(ans,0, sizeof(ans)); 15 cin>>k; 16 stack<int> s; 17 int len=strlen(k),it=0,Max=0,cnt=0; 18 for(int i=0;i<len;i++){ 19 if(k[i]=='(') 20 s.push(i); 21 if(k[i]==')'&&!s.empty()){ 22 ans[s.top()]=1; 23 ans[i]=1; 24 s.pop(); 25 } 26 } 27 for(int i=0;i<len;i++){ 28 if(ans[i]==1){ 29 cnt++; 30 } 31 32 if(cnt&&ans[i]==0){ 33 Max=max(Max,cnt); 34 cnt=0; 35 } 36 37 if(i==len-1) 38 Max=max(Max,cnt); 39 } 40 cout<<Max<<endl; 41 } 42 return 0; 43 }