Jack’s sequence
题目描述
定义括号序列为如下规则序列(字符串):
1 空序列是规则序列;
2 如果S是规则序列,那(S)也是规则序列;
3 如果A和B都是规则序列,那么AB也是规则序列.
例如,下面的字符串都是规则序列:
(), (()), ()() , ()(()) , (()())
现在有一个合法的括号序列,你的任务是找出该序列“下一个”合法且与原序列等长的括号序列。
这里下一个指的是字典序比较,认为 '(' 小于 ')' ,例如 "(())" < "()()"
输入
多组测试数据。第一行有一个正整数T(T ≤ 1000),表示有T组数据。 每组数据占一行,为一行括号序列,保证括号序列合法且长度 <= 10,000。
输出
每组测试数据输出一行。 如果该序列存在“下一个”合法且与原序列等长的括号序列,输出它。 如果不存在,则输出"No solution"。
样例输入
4 ()() (())() ()(()) ((()))
样例输出
No solution ()(()) ()()() (()())
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 6 char str[10005]; 7 int flag[10005]; 8 9 int main() 10 { 11 int t,i,cnt,tag,num; 12 scanf("%d",&t); 13 getchar(); 14 while(t--) 15 { 16 scanf("%s",str); 17 int len=strlen(str); 18 cnt=0,num=0; 19 //寻找可以更新的'(' 20 for(i=0; i<len; i++) 21 { 22 if(str[i]=='(') 23 { 24 cnt++; 25 tag=0; 26 } 27 else 28 { 29 cnt--; 30 if(!tag && cnt>0) 31 { 32 flag[num++]=tag=i-1; 33 } 34 } 35 } 36 //判断是否存在可变的’(' 37 cnt=0,tag=0; 38 for(i=num-1; i>=0; i--) 39 { 40 if(flag[i]) 41 { 42 tag=flag[i]; 43 break; 44 } 45 } 46 47 if(!tag) {puts("No solution"); continue; } 48 49 for(i=0; i<tag; i++) 50 { 51 printf("%c",str[i]); 52 if(str[i]=='(') cnt++; 53 else cnt--; 54 } 55 cnt--; 56 printf(")"); 57 58 for(i=0; i<(len-tag-cnt)/2; i++) printf("("); 59 for(i=0; i<(len-tag+cnt)/2; i++) printf(")"); 60 puts(""); 61 } 62 63 return 0; 64 }