描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
-
输入
-
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行 样例输入
-
4 [] ([])[] ((] ([)]
样例输出
-
0 0 3
2
-
/*题解: 1.若第i个字符到第j - 1个字符中没有与第j个字符匹配的括号,则所需的括号数加1,即dp[i][j] = dp[i][j - 1] + 1; ( j > i )
2.若第k(i <= k < j)个字符与第j个字符匹配,那么所需括号数为第 i 到第k - 1个字符所需字符数加上第k + 1个字符到第j- 1个字符
(注意可能存在多个字符与之匹配,即可能存在多个k), 所需括号数dp[i][j] = min(dp[i][j], dp[i][k - 1] + dp[k + 1][j- 1])。 -
*/
-
//标程:
#include<iostream> #include<cstring> #include<string> using namespace std; int dp[110][110]; //dp[i][j] 表示从第i个到第j个需要增加的最小括号数。 int fun(char a, char b){ if(a == '(' && b == ')') return 1; if(a == '[' && b == ']') return 1; return 0; } int min(int a,int b) { return a < b ? a : b; } int main() { // freopen("a.txt","r",stdin); int t, i, j, k; cin >> t; while(t --) { string str; cin >> str; int len = str.size(); memset(dp,0,sizeof(dp)); for(i = 0; i <= len; ++ i) dp[i][i] = 1; for(i = 2; i <= len; ++ i) { for(j = i - 1; j >= 1; -- j) { dp[j][i] = dp[j][i - 1] + 1; for(k = j; k < i; ++ k) { if(fun(str[k - 1], str[i - 1])) dp[j][i] = min(dp[j][i], dp[j][k - 1] + dp[k + 1][i - 1]); } } } cout << dp[1][len] << endl; } return 0; }