#P06321. Insertion题解

传送门

Description

给你一个只有"("和")"字符串,请你把这个字符串补全,即让每一个"("都和")"配对

Format

Input

第一行给出字符串长度,在100以内

第二行给出字符串

Output

输出字典符最小的结果

Samples

输入数据 1

8
))))((((

输出数据 1

(((())))(((())))

输入数据 2

10
(()))(()((

输出数据 2

((()))(()(()))

Hint

左括号的ascii码是40

右括号的ascii码是41

你猜我是怎么知道的?

———————————————————————————————————————————

根据题面可知,要让每对'('和')'配对

大家可以先去看看我的另一篇博客

传送门

这题思路和那题差不多

其实上次说的“第一眼,本蒟蒻下意识以为这题跟以前做过的一道题很像
再看一眼,感觉还是很像”就是这题

思路来啦

这题其实就是一道和栈有关,但又不完全有关的大水题

根据题意可知

要让所有的左括号和所有的右括号配对

那样的话,就只需创建两个变量

sum1和sum2

先读入

然后从左往右扫一遍

如果这个字符是'(',那就把sum1++

否则将sum1--

再判段

如果sum1<0

就把sum2++

代表要增加sum2个'('

因为要让字典序最小

所以要先输出sum2个'('

再输出原数组

最后输出sum1个')'

——————————————————————————————————

终于又到了激动人心的上代码环节了

#include <bits/stdc++.h>
using namespace std;
char a[200000];//定义一个字符数组
int main(){
	int n,sum1=0,sum2=0;
	cin>>n;//输入
	cin>>a+1;//输入
    for(int i=1;i<=n;i++){
        if(a[i]=='(') sum1 ++;//如果这个字符是'(',那就把sum1++
        else sum1 --;//否则将sum1--
        if(sum1<0) {
            sum2++;
            sum1 = 0;
            //如果sum1<0,就把sum2++
        }
    }
    for(int i=1;i<=sum2;i++){//输出sum2个'('
        cout<<"(";
    }
    for(int i=1;i<=n;i++){//输出原数组
        cout<<a[i];
    }
    for(int i=1;i<=sum1;i++){//输出sum1个')'
        cout<<")";
    }
	return 0 ;//功德圆满
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值