按照紫书的思路,首先找出包含该序列的正规括号序列的长度,然后按照长度递归打印相应的字符即可,具体首先见如下代码:(注意处理好输入和输出)
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
using namespace std;
int length[110][110];
int T,n;
char s[110];
bool match(char a, char b){
return ((a == '['&&b == ']') ||
(a == '('&&b == ')'));
}
void dp(){
for (int i = n - 2; i >= 0; i--){
for (int j = i + 1; j < n; j++){
length[i][j] = n;
if (match(s[i], s[j])) length[i][j] = min(length[i][j],length[i+1][j-1]);
for (int k = i; k < j; k++)
length[i][j] = min(length[i][j],length[i][k]+length[k+1][j]);
}
}
}
void Print(int i,int j){
if (i > j) return;
if (i == j){
if (s[i] == '(' || s[i] == ')') printf("()");
else printf("[]");
return;
}
int result = length[i][j];
if (match(s[i], s[j]) && result == length[i + 1][j - 1]){
printf("%c",s[i]);
Print(i+1,j-1);
printf("%c",s[j]);
return;
}
for (int k = i; k < j; k++){
if (result == length[i][k] + length[k + 1][j]){
Print(i,k);
Print(k+1,j);
return;
}
}
}
int main(){
scanf_s("%d",&T);
getchar();
while (T--){
gets_s(s); gets_s(s);
n = strlen(s);
if (n){
for (int i = 0; i <=n; i++){
length[i + 1][i] = 0;
length[i][i] = 1;
}
dp();
Print(0, n - 1);
}
puts("");
if (T){
puts("");
}
}
while (1){}
return 0;
}