题目链接:https://nanti.jisuanke.com/t/39615
题解:两种都从后往前,l记录左括号的数量,r记录右括号数量,找前驱时,要满足第一个符合的s[i]==')' && r>=l && l>0,然后前面的直接输出,先把多余的右括号输出,剩下相等的左右括号一块输出,找后驱要找第一个符合s[i]=='(' && r-1>=l,先输出一个右括号,然后吧左括号都输出,在把右括号都输出。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
char s[N];
int main()
{
while(~scanf("%s",s))
{
int len=strlen(s);
int l,r;
l=r=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]==')') r++;
else l++;
if(s[i]==')' && r>=l && l)
{
// cout<<i<<endl;
for(int j=0;j<i;j++)
printf("%c",s[j]);
printf("(");
l--;
while(l!=r)
{
printf(")");
r--;
}
while(l&&r)
{
printf("()");
l--,r--;
}
break;
}
}
printf("\n");
l=r=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]==')')r++;
else l++;
if(s[i]=='(' && r-1>=l)
{
for(int j=0;j<i;j++)
printf("%c",s[j]);
printf(")");
r--;
while(l)
{
printf("(");
l--;
}
while(r--) printf(")");
break;
}
}
printf("\n");
}
return 0;
}