现在的位置: 首页 > 综合 > 正文

暴力集锦

2017年10月12日 ⁄ 综合 ⁄ 共 768字 ⁄ 字号 评论关闭

http://blog.csdn.net/acm_ted/article/details/8022419

第三题:Bracket Sequence

题意:给你一段只包含'(',')','[',']'的字符串,问哪段子串的括号匹配是正确的且包含尽可能多的'['。

题解:用num数组记录前i个字符包含'['的个数,再计算以第i个字符开始,符合条件的字符串的长度,用l数组记录,最后查找最优值。

代码:

#include<cstdio>
#include<cstring>
using namespace std;
#define M 100005
char s[M];
int num[M],l[M];
bool check(char a,char b)
{
    return ((a=='('&&b==')')||(a=='['&&b==']'));
}
int main()
{
    scanf("%s",s);
    int len=strlen(s);
    memset(l,0,sizeof(l));
    num[0]=0;
    for(int i=0; i<len; ++i)
        num[i+1]=num[i]+(s[i]=='[');
    for(int i=len-2; i>=0; --i)
    {
        if(s[i]==')'||s[i]==']') continue;
        int idx=i+1+l[i+1];
        if(check(s[i],s[idx]))
            l[i]=idx-i+1+l[idx+1];
    }
    int ans=0,st=0;
    for(int i=0; i<len; ++i)
        if(ans<num[i+l[i]]-num[i])
        {
            ans=num[i+l[i]]-num[i];
            st=i;
        }
    printf("%d\n",ans);
    for(int i=0; i<l[st]; ++i)
        printf("%c",s[st+i]);
    printf("\n");
    return 0;
}

抱歉!评论已关闭.