2020牛客寒假算法基础集训营6.G——括号序列【STL】

题目传送门


题目描述

合法括号序列的定义是:

  1. 空序列是合法括号序列
  2. 如果 S 是一个合法括号序列,那么(S)是合法括号序列
  3. 如果 A 和 B 都是合法括号序列,那么 AB 是一个合法括号序列

现在给定一个括号序列,求最少删去几个括号能得到一个合法的括号序列
输入包含 T 组数据,每组数据中,设括号序列的长度为 N
1 T ,     Σ N 1 , 000 , 000 1≤T,\ \ \ ΣN≤1,000,000
(由于空串是合法的括号序列,所以答案可以是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;
	}
}
发布了196 篇原创文章 · 获赞 124 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Q_1849805767/article/details/104335554
今日推荐