#P06324. 括号序列题解

传送门

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 ;//写完收工
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值