读入整个字符串后统计 () 的个数是多少。

现在设左右括号需要再添加的个数为 $l,r$。

  • 若读入一个 ( 则说明需要加上一个 ) 才能完整配对,即 ++r

  • 若读入一个 ) 则说明需要加上一个 ) 才能完整配对,此时有两种情况:$l = 0$ 则说明需要增加 ( 个数,即 ++l;$l > 0$ 则说明一组括号已配对,--l 即可。

最后先输出增加的 $l$ 个 (,然后输出原字符串,最后输出增加的 $r$ 个 )

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cstdio>
using namespace std;
int main ()
{
//freopen (".in","r",stdin);
//freopen (".out","w",stdout);
int n,l = 0,r = 0;
string str;
cin>>n>>str;
for (int i = 0;i < n;++i)
{
if (str[i] == '(') ++r;//增加右括号数量
if (str[i] == ')')//需要左括号
{
if (r > 0) --r;//成功配对,增加的右括号数量减少
else ++l;//增加左括号数量
}
}
for (int i = 1;i <= l;++i) cout<<'(';
cout<<str;
for (int i = 1;i <= r;++i) cout<<')';
cout<<endl;
return 0;
}