Jack’s sequence

题目描述

定义括号序列为如下规则序列(字符串): 
1 空序列是规则序列;
2 如果S是规则序列,那(S)也是规则序列;
3 如果A和B都是规则序列,那么AB也是规则序列.
例如,下面的字符串都是规则序列:
(), (()), ()() , ()(()) , (()())
现在有一个合法的括号序列,你的任务是找出该序列“下一个”合法且与原序列等长的括号序列。
这里下一个指的是字典序比较,认为 '(' 小于 ')' ,例如 "(())" < "()()"

输入

多组测试数据。第一行有一个正整数T(T ≤ 1000),表示有T组数据。 每组数据占一行,为一行括号序列,保证括号序列合法且长度 <= 10,000。

输出

每组测试数据输出一行。 如果该序列存在“下一个”合法且与原序列等长的括号序列,输出它。 如果不存在,则输出"No solution"。

样例输入

4
()()
(())()
()(())
((()))

样例输出

No solution
()(())
()()()
(()())
 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 }
View Code

 

posted @ 2013-05-19 00:08  1002liu  阅读(206)  评论(0编辑  收藏  举报