九度 題目1337:尋找最長合法括號序列
阿新 • • 發佈:2019-01-28
- 題目描述:
- 給你一個長度為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 ****************************************************************/