16.括号匹配

题目

Description
在乐学上出了一道给定括号序列,判断其合法性的问题。
括号序列是由左括号“(”和右括号“)”组成的非空序列。对于一个括号序列很容易判定其合法性。比如“()”、“(())()”、“(()())”、“(()(()))”、“()()()”都是合法的,而“)”、“(”、“(()”、“(()))(”都是非法的。
看了一眼题,立刻去饮水机处接了一杯水。
意识到他是在暗示这道题太水了,于是立刻把题改了改,增加了一、、难度。
给定  个括号序列,两两配对,问最多能组成多少对合法括号序列。(每一个括号序列只能在一对中出现)
接完水回来再看了看新题,开始挠头了,快帮帮他!
Input
第一行输入整数   表示有  个括号序列。
接下来  行,每行输入一个只由“(”和”)“构成的字符串  。(字符串长度满足)
所有字符串长度总和满足。
Output
输出一个整数,表示最大的合法括号序列对数。
Hint
第一组用例可以组成2对合法括号序列,分别是“((   )())”、“(   )”。

C++整体代码

#include 
#include 
#include 
#include 
#include 
using namespace std;

void simplify(string& s) {
    string simplified;
    int count = 0;
    for (char ch : s) {
        if (ch == '(') {
                simplified.push_back(')');
                count++;
        }
        else if (ch == ')') {
            if (count > 0&&simplified.back() == ')') {
                count--;
                simplified.pop_back();
            }
            else {
                simplified.push_back('(');
                count++;
            }
        }
    }
    if (count == 0) s = "";
    s = simplified;
}

int main() {
    int n;
    cin >> n;
    vector vec(n);
    vector l(5e5 + 1, 0), r(5e5 + 1, 0);
    int valid = 0;
    for (int i = 0; i < n; i++) {
        int left = 0, right = 0;
        cin >> vec[i];
        simplify(vec[i]);

        if (vec[i] == "") valid++;
        else {
            for (char ch : vec[i]) {
                if (ch == '(') {
                    left++;
                }
                else {
                    right++;      
                }
            }
            if (left && !right) {
                l[left]++;
            }
            else if (!left && right) {
                r[right]++;
            }
        }
    }
    int sum = 0;
    for (int j = 0; j <= 5e5; j++) {
        sum += min(r[j], l[j]);
    }
    sum += valid / 2;
    cout << sum << endl;
    return 0;
}

你可能感兴趣的:(程序设计方法与实践,算法,c++)