2020牛客寒假算法基础集训营6 G 括号序列

https://ac.nowcoder.com/acm/contest/3007/G
题目描述

合法括号序列的定义是:

1.空序列是合法括号序列

2.如果 S 是一个合法括号序列,那么(S)是合法括号序列

3.如果 A 和 B 都是合法括号序列,那么 AB 是一个合法括号序列

现在给定一个括号序列,求最少删去几个括号能得到一个合法的括号序列

输入包含 T 组数据,每组数据中,设括号序列的长度为 N

1≤T,ΣN≤1,000,000

(由于空串是合法的括号序列,所以答案可以是N)

思路

模拟一个栈,如果遇到'('就进栈,如果遇到')'就判断一下,如果栈空,记一次数,如果是栈顶左括号就弹出即可

#include 
using namespace std;
int T;
const int N = 1e6 + 10;
char s[N];
char st[N];
int top;
int n;
int ans() {
    top = 0;
    int res = 0;
    for (int i = 1; i <= n; i++) {
        if (s[i] == '(') {
            st[++top] = '(';
        }
        else {
            if (top == 0) ++res;
            else if (st[top] == '(') {
                top--;
            }
        }
    }
    res += top;
    return res;
}
int main()
{
    ios::sync_with_stdio(0);
    cin >> T;
    while (T--) {
        cin >> n;
        cin >> s + 1;
        cout << ans() << "\n";
    }
    return 0;
}

 

你可能感兴趣的:(#)