最長合法括號序列:棧(括號題)
阿新 • • 發佈:2019-02-07
題目描述
這是另一道處理合法括號序列的題目。
我們應該提醒你,如果一個括號序列插入“+”和“1”後,可以得到一個正 確的數學表示式,那麼它被稱為“合法”的。
例如,序列“(())()”,“()”和“(()(()))”是合法的,但“)(”,“(()”和“(()))(”不是。
給出一個由“(”和“)”字元組成的字串。你要找出它最長的是合法括號序列的子串,也同樣要找出最長子串的個數。
題解
括號題容易想到棧,把左括號壓進去,右括號會跟棧頂的左括號匹配,然後這個左括號會跟它位置-1的合法括號序列拼起來,所以記一個DP即可
程式碼
#include <bits/stdc++.h> #define maxn 2000005 using namespace std; int n,f[maxn],mx,ans; stack<int> S; char c[maxn]; int main(){ scanf("%s",c+1); n=strlen(c+1); for(int i=1;i<=n;i++){ if(c[i]=='(') S.push(i); else if(!S.empty()){ f[i]=f[S.top()-1]+i-S.top()+1; mx=max(mx,f[i]); S.pop(); } } for(int i=1;i<=n;i++){ if(f[i]==mx) ans++; } if(mx==0) puts("0 1"); else printf("%d\n%d\n",mx,ans); return 0; }