一开始看到这道题以为题目有问题 只是自己没有好好看题目
1、字符串中必须仅有 P
、 A
、 T
这三种字符,不可以包含其它字符;
(这个要求的意思是 不能有除了PAT外其他字符)
2、任意形如 xPATx
的字符串都可以获得“答案正确”,其中 x
或者是空字符串,或者是仅由字母 A
组成的字符串;
(这句话的意思是 xPATx中除PAT这个字符串不能变 x可以改为空字符串(不是空格)或仅有A组成的字符串 即 PAT APATA AAPATAA AAAPATAAA ....依次类推 可以理解为以PAT为基准 往其左右两边分别放入等量的A)
3、如果 aPbTc
是正确的,那么 aPbATca
也是正确的,其中 a
、 b
、 c
均或者是空字符串,或者是仅由字母 A
组成的字符串。
(这句话是这题最难懂的 其中正确的aPbTc的来源有两种.
第一种,来自第二个要求中的PAT APATA AAPATAA...,这里以AAPATAA为例子 a=AA b=A c=AA 则带入aPbATca可知其内容为 AAPAATAAAA
第二种,来自第三个要求中的正确项,如上面举例后得出的AAPAATAAAA 其中 a=AA b=AA c=AAAA 则带入aPbATca可知其内容为 AAPAAATAAAAAA 这个结果又可以带入 aPbTc)
能看出规律是 P左边的A的数量 * 即在P右边又在T左边的A的数量 =T右边的A的数量
#include<stdio.h>
#define N 110
int yesorno(char *s)
{
int i=0,a=0,b=0,c=0,p=0,t=0;
while(s[i]!='\0')
{
if(s[i]!='A' && s[i]!='P' && s[i]!='T' &&s[i]!=' ') //判断有没有其他字符
return 0;
if(s[i]=='A' &&p==0 && t==0) //记录P左A的数量
{
a++;
}
if(s[i]=='A' &&p!=0 && t==0) //记录P右T左A的数量
{
b++;
}
if(s[i]=='A' &&p!=0 && t!=0) //记录T右A的数量
{
c++;
}
if(s[i]=='P' && p==0){
p=i+1;
}else if(p!=0 && s[i]=='P'){ //如果不止一个P
{
return 0;
}
}
if(s[i]=='T' && t==0){
t=i+1;
}else if(t!=0 && s[i]=='T'){ //如果不止一个T
{
return 0;
}
}
i++;
}
if(b==0) //如果PT中间没有A 说明输入的格式可能为APT 或者 TAP 这两种主要情况
return 0;
if(c==a*b && p!=0 && t!=0) // a*b=c 并且 p!=0 t!=0
{
return 1;
}
return 0;
}
int main()
{
int n,i;
char s[N];
if(scanf("%d",&n)==1)
{
if(n<10)
{
for(i=0;i<n;i++)
{
if(scanf("%s",s)==1)
{
if(yesorno(s))
{
printf("YES");
}else{
printf("NO");
}
if(i!=n-1)
printf("\n");
}
}
}
}
return 0;
}