括号匹配(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:6
- 描述
- 给你一个字符串,里面只包含”(“,”)”,”[“,”]”四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的- 输入
- 第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 - 输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
- 样例输入
4 [] ([])[] ((] ([)]
- 样例输出
0 0 3 2
AC代码如下:
#include <stdio.h>
#include <string.h>
//dp[i][j] 表示str[i, j]闭区间匹配添加括号的最小的数
int dp[100][100];
int solve(char str[])
{
memset(dp, 0, sizeof(dp));
int len = strlen(str);
//只含有一个字符,dp[i][i]=1
for(int i=0; i<len; i++)
dp[i][i] = 1;
for(int i=1; i<len; i++)
{
for(int j=0; j<len-i; j++)
{
int k = j+i, t, min=100;
//dp[i][j]赋最大值
dp[j][k] = 100;
//若str[j] str[k]匹配,则dp[j][k] = dp[j+1][k-1];
if((str[j]=='(' && str[k]==')') || (str[j]=='[' && str[k]==']'))
dp[j][k] = dp[j+1][k-1];
for(int s=j; s<k; s++)
{
t = dp[j][s] + dp[s+1][k];
if(t<min)min=t;
}
//dp[j][k] = min(dp[j][s], dp[s+1][k])
if(dp[j][k]>min)dp[j][k]=min;
}
}
return dp[0][len-1];
}
int main()
{
int t;
char str[101];
scanf("%d", &t);
getchar();
while(t--)
{
gets(str);
printf("%d\n", solve(str));
}
return 0;
}