在黄霖的博客里看到这道题 是他们湘大比赛的一道 刚开始自己想的比较复杂 一看他 的 代码 原来这么简单 啊啊~TAT。。。看完他的思想 自己在写了一遍,其实 写的 和他差不多啦。。
#include<stdio.h> #include<string.h> int main() { int i,j,n,m,len,k,num,f[10010]; char s[10100]; while(~scanf("%d",&n)) { while(n--) { scanf("%s",s+1); len=strlen(s+1); f[0]=0; for(i=1;i<=len;i++) if(s[i]=='(') f[i]=f[i-1]+1; //左括号比右括号多的个数 f[i]都不能小于0 else f[i]=f[i-1]-1; for(i=len;i>0;i--) { if(f[i]>=2&&s[i]=='(') //只有 f[i]>=2时 ‘(’变成‘)’ f[i]才不会<0 { k=i; break; } } if(i==0) printf("No solution\n"); else { for(i=1,num=0;i<k;i++) { if(s[i]=='(') num++; printf("%c",s[i]); } printf(")"); for(i=0;i<len/2-num;i++) printf("("); //其他的只要先填完( 再填 )就ok了 for(j=0;j<len-k-i;j++) printf(")"); printf("\n"); } } } return 0; }