[Jobdu] 題目1337:尋找最長合法括號序列


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

用一個bool型的數組來標記匹配情況。

 1 #include <iostream>
 2 #include <stack>
 3 #include <string>
 4 #include <cstring>
 5 using namespace std;
 6  
 7 int n;
 8 string s;
 9  
10 void getRes() {
11     bool a[s.length()];
12     memset(a, false, s.length());
13     stack<int> st;
14     for (int i = 0; i < s.length(); ++i) {
15         if (s[i] == '(') {
16             st.push(i);
17         } else {
18             if (!st.empty()) {
19                 a[i] = true;
20                 a[st.top()] = true;
21                 st.pop();
22             }
23         }
24     }
25  
26     int max = 0, cnt = 1, tmp = 0;
27     for (int i = 0; i < s.length(); ++i) {
28         if (a[i]) {
29             ++tmp;
30         } else {
31             tmp = 0;
32         }
33         if (max == tmp && max != 0) {
34             ++cnt;
35         } else if (max < tmp) {
36             max = tmp;
37             cnt = 1;
38         }
39     }
40     cout << max << " " << cnt << endl;
41 }
42  
43 int main() {
44     while (cin >> n) {
45         cin >> s;
46         getRes();
47     }
48     return 0;
49 }
50  
51 /**************************************************************
52     Problem: 1337
53     User: hupo250
54     Language: C++
55     Result: Accepted
56     Time:310 ms
57     Memory:7604 kb
58 ****************************************************************/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM