#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
const int MAXSIZE = 128;
string in;
int dp[MAXSIZE][MAXSIZE];
bool IsMatch(char a, char b) {
return (a == '(' && b == ')') || (a == '[' && b == ']');
}
void Print(int i, int j) {
if (i > j) return;
if (i == j) {
if (in[i] == '(' || in[i] == ')') cout << "()";
else cout << "[]";
return;
}
int ans = dp[i][j];
if (IsMatch(in[i], in[j]) && ans == dp[i + 1][j - 1]) {
cout << in[i];
Print(i + 1, j - 1);
cout << in[j];
return;
}
for (int k = i; k < j; ++k) {
if (ans == dp[i][k] + dp[k + 1][j]) {
Print(i, k);
Print(k + 1, j);
return;
}
}
}
int main()
{
int n;
cin >> n;
cin.get();
while (n--) {
memset(dp, 0, sizeof(dp));
//前面还有个空行
getline(cin, in);
getline(cin, in);
int len = in.size();
for (int i = 0; i < len; ++i) { dp[i][i] = 1; }
for (int i = len - 2; i >= 0; --i) {
for (int j = i + 1; j < len; ++j) {
dp[i][j] = len;
if (IsMatch(in[i], in[j])) dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);
for (int k = i; k < j; ++k) {
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j]);
}
}
}
Print(0, len - 1);cout << endl;
if (n) cout << endl;
}
return 0;
}
12-25
08-15
1192
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-01