1. 程式人生 > >九度 題目1337:尋找最長合法括號序列

九度 題目1337:尋找最長合法括號序列

題目描述:
給你一個長度為N的,由’(‘和’)’組成的括號序列,你能找出這個序列中最長的合法括號子序列麼?合法括號序列的含義便是,在這個序列中,所有的左括號都有唯一的右括號匹配;所有的右括號都有唯一的左括號匹配。例如:((()))()()便是一個長度為10的合法括號序列,而(()))( 則不是。 需要你求解的是,找出最長的合法括號子序列的長度,同時找出具有這樣長度的序列個數。
輸入:
測試資料包括多個,每個測試資料包含兩行: 第一行為一個整數N,其中N不會超過10^6。 第二行為一個長度為N的字串,這個字串由左括號'('和右括號')'組成。
輸出:
對應每個測試案例,輸出一行,其中包含兩個整數,分別代表最長合法括號序列的長度和個數,中間由空格隔開。若沒有合法的子序列存在,則返回0 1。
樣例輸入:
6
(())()
3
))(
樣例輸出:
6 1

0 1

/////////////////////////////////////////////////////////////////////////////////////////////

每遇到一個)就向前找(,將他倆統一記為 1,統計連續1的最多的個數。

#include<stack>
#include<iostream>
#include<string.h>
using namespace std;
char s[1000001];
int main()
{
    int n,j,k;
    bool ga;
    while(cin>>n&&n>0)
    {
        cin>>s;
        for(j=0;j<n;j++)
        {
            ga=false;
            if(s[j]=='(')
                ;
            else
            {
                for(k=j-1;k>=0;k--)
                {
                    if(s[k]=='(')
                    {
                        s[k]='1';
                        s[j]='1';
                        break;
                    }
                    else if(s[k]==')')
                        break;
                }
            }
        }
        int maxl=0;
        int maxln=0;
        int jb;
        for(j=0;j<n;j++)
        {
            jb=j;
            while(s[j]=='1')
                j++;
            if(maxl==0)
            {
                maxl=j-jb;
                maxln=1;
            }
            else if(maxl>0&&maxl==j-jb)
                maxln++;
            else if(maxl>0&&maxl<j-jb)
            {
                maxl=j-jb;
                maxln=1;
            }
        }
        if(maxln==0)
            cout<<"0 1"<<endl;
        else
            cout<<maxl<<" "<<maxln<<endl;
    }
    return 0;
}
/**************************************************************
    Problem: 1337
    User: 午夜小白龍
    Language: C++
    Result: Accepted
    Time:960 ms
    Memory:2496 kb
****************************************************************/