• [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 ****************************************************************/
  • 相关阅读:
    用DOS把一个文件夹下的所有文件名打印到txt文件里
    多线程时的CreateDispatch问题
    [转载]惟楚有才
    [转] 数学专业参考书整理推荐
    大整数处理类(cpp文件)
    [转]英文文献检索
    大整数处理类(头文件)
    国外遥感GIS期刊整理(转)
    [转载]Hibernate中No row with the given identifier exis
    在武汉,总有那么一个词~~~
  • 原文地址:https://www.cnblogs.com/easonliu/p/3899543.html
Copyright © 2020-2023  润新知