PAT乙级1003我要通过 总有两个测试点没过,求解答

PAT乙级1003我要通过 总有两个测试点没过,求解答
#include <stdio.h>
#include <string.h>
int panduan(char *p);
int sfbhqtzf(char *pt);   //是否包含其他字符
int pd1(char *pt);  //判断xPATx
int pd2(char *pt);  //判断xPAATxx

int main(void)
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        char str[101];
        scanf("%s",str);
        if(panduan(str)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

int panduan(char *p)
{
    if(sfbhqtzf(p))   //包含其他字符
    {
        return 0;
    }else if(pd1(p)){
        return 1;
    }else if(pd2(p)){
        return 1;
    }
    return 0;
}

int sfbhqtzf(char *pt)  //判断是否包含其他字符  包含返回1
{
    int i=0;
    while(pt[i]!='\0')
    {
        if(pt[i]!='P' && pt[i]!='A' && pt[i]!='T')
            return 1;
        i++;
    }
    return 0;
}

int pd1(char *pt)  //判断xPTAx 是返回1
{
    int i=0;
    int x=0;
    while(pt[i]=='A')
    {
        i++;
        x++;
    }
    if((2*x+3) != strlen(pt))
        return 0;
    char str[2*x+3];
    for(int i=0;i<2*x+3;i++)
    {
        str[i]='A';
    }
    str[x]='P';  str[x+2]='T';
    //if(strcmp(str,pt)==0)   //判断str和pt是否相等
        //return 1;
    //else
        //return 0;
    for(int l=0;l<2*x+3;l++)
    {
        if(str[l] != pt[l])
            return 0;
    }
    return 1;
}

int pd2(char *pt)  //判断xPAATxx  是返回1
{
    int i=0;
    int x=0;
    while(pt[i]=='A')
    {
        i++;
        x++;
    }
    if((3*x+4) != strlen(pt))
        return 0; 
    char str[3*x+4];
    for(int i=0;i<3*x+4;i++)
    {
        str[i]='A';
    }
    str[x]='P';  str[x+3]='T';
    //if(strcmp(str,pt)==0)   //判断str和pt是否相等
     //   return 1;
    //else
        //return 0;
    for(int l=0;l<3*x+4;l++)
    {
        if(str[l] != pt[l])
            return 0;
    }
    return 1;
}

img

img

img

供参考:https://blog.csdn.net/weixin_45947840/article/details/105900982?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.essearch_pc_relevant&spm=1001.2101.3001.4242