登录后台

页面导航

本文编写于 1359 天前,最后修改于 662 天前,其中某些信息可能已经过时。

image-20210207224640529

题解

该题为括号匹配问题,求最多能够匹配的对数,可以发现 )(,这种情况的括号一定不能够参与匹配,只有去除匹配括号后剩余全部为左括号或右括号才能够参与匹配,与其他的组成完整的括号序列。

代码
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
char a[500500]={0};
int num[500500]={0};
int b[100500]={0};
stack<char>s;
int main()
{
    int n;
    scanf("%d",&n);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",a+1);
        for(int j=1;a[j];j++)
        {
            if(s.empty())
            {
                s.push(a[j]);
            }
            else    
            {
                if(a[j]==')'&&s.top()=='(')
                    s.pop();
                else
                    s.push(a[j]);
            }
        }
        int sum1=0,flag=1;
        while(!s.empty())
        {
            if(s.top()==')')
            {
                s.pop();
                if(sum1>0)
                    flag=0;
                else
                    sum1--;
            }
            else
            {
                s.pop();
                if(sum1<0)
                    flag=0;
                else
                    sum1++;
            }
        }
        if(flag)
        {
            if(sum1<0)
                num[-sum1]++;
            b[i]=sum1;
            if(sum1==0)
                ans++;
        }
    }
    ans/=2;
    for(int i=1;i<=n;i++)
    {
        if(b[i]<=0)
            continue;
        else
        {
            if(num[b[i]]!=0)
                num[b[i]]--,ans++;
        }
    }
    cout<<ans<<endl;
}