题目描述
合法括号序列的定义是:
- 空序列是合法括号序列
- 如果 S 是一个合法括号序列,那么(S)是合法括号序列
- 如果 A 和 B 都是合法括号序列,那么 AB 是一个合法括号序列
现在给定一个括号序列,求最少删去几个括号能得到一个合法的括号序列
输入包含 T 组数据,每组数据中,设括号序列的长度为 N
(由于空串是合法的括号序列,所以答案可以是N)
输入描述:
第一行一个数字 T
接下来 T 组数据共 2T 行,每组数据第一行是 N
第二行则是一个长度为 N 的括号序列
输出描述:
T 行 T 个数字,表示输入的括号序列最少删去几个括号能得到一个合法的括号序列
输入
2
6
())(()
9
()(()()))
输出
2
1
题解
- 很经典的题目了,也没什么变动
- 求匹配数,减一下就行
AC-Code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6;
int dp[maxn];
int main() {
int T; cin >> T; while (T--) {
int n; cin >> n;
string s; cin >> s;
int cnt = 0;
stack<char> st;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == '(')
st.push(s[i]);
else if (!st.empty()) {
if (st.top() == '(') {
++cnt;
st.pop();
}
}
}
cout << n - 2 * cnt << endl;
}
}