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;
}
后面还有种用压栈的方法去做······