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;
}