题目描述
给定一个只包含 (
与 )
的括号序列,请删除尽量少的括号,使它变成平衡的。平衡的定义如下:
- 空序列是平衡的;
- 如果某个括号序列
s
是平衡的,那么(s)
也是平衡的; - 如果某两个括号序列
s
与t
都是平衡的,那么st
也是平衡的。
输入格式
单个字符序列:表示输入的序列,保证只包含 (
与 )
。
输出格式
单个整数:表示最少删去多少个括号才能使输入序列变成平衡的。
数据范围
设 n 表示输入序列的长度
- 对于 50% 的数据,1≤n≤1,000;
- 对于 100% 的数据,1≤n≤1,000,000;
样例数据
输入:
()()
输出:
0
说明:
序列原本就是平衡的
输入:
(()
输出:
1
说明:
删去一个(
输入:
)(
输出:
2
说明:
需要全删
题解:
本题关键点:以左面刮号为主,右面刮号匹配左面刮号。代码如下。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string n;
int ans = 0;
cin >> n;
int len,l,sum;
len = n.length();
l = 0;
for (int i = 0; i < len; i++) {
if (n[i] == '(') {
l++;
}
if (n[i] == ')') {
if (l > 0) {
l--;
}
else {
ans++;
}
}
}
sum=ans+l;
cout << sum << endl;
return 0;
}