题目:点击打开链接
用一个栈,每次弹栈之后,读取弹栈之后,最高的那个下标,那个与当前坐标的差就是最长的序列。
如果说是判断合法括号串,那么扫描一遍之后如果栈空就说明合法,对于括号子串也是如此,只不过是“部分空”,所以读取“弹栈之后,最高的那个下标”,当前下标与其做个差就是当前长度。
一开始可以存一个"-1"修正一下。
#include<iostream> #include<string.h> #include<string> #include<algorithm> #include<stdio.h> using namespace std; const int maxn = 1200000; pair<int,char> stk[maxn]; char str[maxn]; int main() { while(scanf("%s",str)!=EOF) { int tail = 0; int len = strlen(str); int ll = 0; int cnt = 0; int tmp = 0; stk[tail ++ ] = make_pair(-1,'+'); for(int i = 0;i<len;i++) { if(str[i] == ')') { if(stk[tail-1].second == '(') { tail --; int x = stk[tail-1].first; if(i - x > ll ) { ll = i - x; cnt = 1; } else if(i - x == ll) cnt++; } else { stk[tail] = make_pair(i,')'); tail ++; } } else if(str[i] == '(') { stk[tail] = make_pair(i,str[i]); tail ++; } } if(ll == 0) cout<<0<<" "<<1<<endl; else cout<<ll<<" "<<cnt<<endl; } return 0; }