2019 计蒜之道 初赛 第六场 A题(括号匹配)

VIPKID 通过大数据和标签来智能地进行师生匹配。当我们把标签抽象成括号 ( ),匹配过程简化为括号串的匹配,希望聪明的你来解决如下问题:判断给定的括号序列是否合法且反回文。
对于这样标签抽象组成的括号序列,我们有如下定义:

合法的的括号序列:
空序列;
如果A、B是合法的括号序列,那么(A)和AB都是合法的括号序列;
反回文的括号序列:如果序列长度为 L,且字符从 0 开始编号,那么任意的 S[i] 和 S[L−i−1]对应的字符应该不同。( i的取值范围 0≤i≤L−1 )

输入格式
一行一个字符串 S。

输出格式
如果是合法且反回文的串,输出 “YES”,否则输出 “NO”。(均无双引号)

数据规模
S 长度小于10。

刚看到这个题目很懵,因为我只会判断反回文,但是我不会用编程去实现判断括号序列是否合法,后面才知道一般用栈去实现,所以我在想能不能一并判断了,一开始我发现只要判断对称即可了,但是测了一下只通过一半的样例,我在想会不会判断对称还是和判断反回文等价呀,就等于我没判断是否合法,因为只通过了一半的样例。
后面测试了以下样例:
)()(
no
())(()
no
((()))
no
(((())()(())))
no

第一次代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fun(char *a)
{
    int i,panduan=0;
    int len=strlen(a);
    for(i=0;i<=len/2-1;i++)
    {
        if(panduan==0)
        {
            if(a[i]=='(')
        {
            if(a[len-i-1]!=')')
                return 0;
                panduan=1;
        }
        else return 0;
        }
        else
        {
            if(a[i]=='(')
            {
                if(a[len-i-1]!=')')
                    return 0;
            }
            else if(a[i]==')')
            {
                if(a[len-i-1]!='(')
                    return 0;
                panduan=0;
            }
            else return 0;
        }
    }
    return 1;
}
int main()
{
    char str[1000010];
    gets(str);
    if(fun(str)==1)
        printf("YES");
    else printf("NO");
    return 0;
}

在测试样例是(((())()(())))时,我的代码是no。但应该是yes。

代码的问题在于要记录未匹配的左括号的个数
而不是只用0和1两个状态

改正后代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int fun(char *a)
{
    int i,panduan=0;
    int len=strlen(a);
    for(i=0;i<=len/2-1;i++)
    {
        if(panduan==0)
        {
            if(a[i]=='(')
        {
            if(a[len-i-1]!=')')
                return 0;
                panduan=1;
        }
        else return 0;
        }
        else
        {
            if(a[i]=='(')
            {
                if(a[len-i-1]!=')')
                    return 0;
    panduan++;//
            }
            else if(a[i]==')')
            {
                if(a[len-i-1]!='(')
                    return 0;
                panduan--;//panduan=0;
            }
            else return 0;
        }
    }
    return 1;
}
int main()
{
    char str[1000010];
    gets(str);
    if(fun(str)==1)
        printf("YES");
    else printf("NO");
    return 0;
}

后面还有种用压栈的方法去做······

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值