Description
给定长度为n的一个括号序列,每次修改可以修改一个位置的括号,若这个括号为’(‘,则修改为’)’,若这个括号为’)’,则修改为’(‘,问最少修改多少个使得原括号序列合法。
其中:
① ()是合法的;
② 若A是合法的,则(A)是合法的;
③ 若A,B都是合法的,则AB是合法的。
Format
Input
一行,给出一个括号序列,其长度在[1,1e5]之间
Output
最少的修改次数
Samples
输入数据 1
())(
输出数据 1
2
输入数据 2
)))(((
输出数据 2
4
Hint
对于样例1
修改为()()
对于样例2
修改为()()()
第一眼,本蒟蒻下意识以为这题跟以前做过的一道题很像再看一眼,感觉还是很像
思路来啦
好吧,这题其实就是一道和栈有关,但又不完全有关的大水题
根据题意可知
要让所有的左括号和所有的右括号配对
那样的话,就只需创建两个变量
sum1和sum2
先读入
然后从左往右扫一遍
如果这个字符是'(',那就把sum1++
否则将sum1--
再判段
如果sum1<0
就把sum2++
代表要改变sum2个')'
循环完后判断
如果sum1>0
说明还有sum1个'('是没配对的
所以还要将sum2 += sum1/2
最后输出sum2就行了
又到了激动人心的上代码环节了
#include <bits/stdc++.h>
using namespace std;
char a[200000];//定义一个字符数组
int main(){
int n,sum1=0,sum2=0;
cin>>a+1;//输入
for(int i=1;a[i]=='('||a[i]==')';i++){//别问为什么循环的这么别扭,因为我是蒟蒻
if(a[i]=='(') sum1 ++;//如果这个字符是'(',那就把sum1++
else sum1 --;//否则将sum1--
if(sum1<0) {
sum2++;
sum1 = 1;
//如果sum1<0,就把sum2++
}
}
if(sum1!=0) sum2 += sum1/2;
//如果sum1>0,说明还有sum1个'('是没配对的,所以还要将sum2 += sum1/2
cout<<sum2;//输出
return 0 ;//写完收工
}