1. 程式人生 > >最長合法括號序列:棧(括號題)

最長合法括號序列:棧(括號題)

題目描述

這是另一道處理合法括號序列的題目。

我們應該提醒你,如果一個括號序列插入“+”和“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;
}