算法 10.括号匹配

问题描述

在这里插入图片描述

输入

在这里插入图片描述

输出

输出一个整数,表示最大的合法括号序列对数。

样例数据

输入(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对合法括号序列,分别是“(( )())”、“( )”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值