问题描述
输入
输出
输出一个整数,表示最大的合法括号序列对数。
样例数据
输入(1)
7
)())
)
((
((
(
)
)
输出(1)
2
输入(2)
2
(())
()
输出(2)
1
代码
其实,应该用栈就可以直接做吧。。
#include<stdio.h>
#include<string.h>
int main()
{
long int m;
char k[100005],q;
int x[100010] = {},y[100010] = {};
long int len;
int p = 0;
scanf("%ld",&m);
scanf("%c",&q);
int flag1,flag2;
for(long int i = 1; i <= m; i ++) //我们把所有的括号字符串都变为更好处理的数字
{
flag1 = 0;
flag2 = 0;
gets(k);
len = strlen(k);
int sum = 0;
for(int j = 0; j < len; j ++) //我们把每个字符串中可以互相匹配的括号都删去,并且记录每个字符串简化之后的状态
{
if(k[j] == '(')
flag1 ++;
if(k[j] == ')')
flag1 --;
if(flag1 < 0)
break;
}
for(int j = len - 1; j > 0; j --)
{
if(k[j] == '(')
flag2 --;
if(k[j] == ')')
flag2 ++;
if(flag2 < 0)
break;
}
if(flag1 < 0 && flag2 < 0) //如果出现了简化结束之后形状是))((...的字符串,那么它一定不能匹配,就不考虑了
{
continue;
}
else //接下来,所有的+n,-n是可以匹配的
{
for(int j = 0; j < len; j ++)
{
if(k[j] == '(')
sum ++;
if(k[j] == ')')
sum --;
}
if(sum==0)
{
p ++;
}
if(sum>0)
{
x[sum] ++;
}
if(sum<0)
{
y[-sum] ++;
}
}
}
int ans = 0;
ans = ans + (p / 2);
for(long int i = 1;i <= 100005;i ++) //把所有可以匹配的进行记录
{
if((x[i] != 0) && (y[i] != 0))
{
if(x[i] >= y[i])
{
ans = ans + y[i];
}
else
{
ans = ans + x[i];
}
}
}
printf("%d\n",ans);
return 0;
}
提示
第一组用例可以组成2对合法括号序列,分别是“(( )())”、“( )”。