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 ;//功德圆满
}