PAT Basic Level 1003 我要通过! (20 分)

本文详细解析了PAT字符串匹配算法的实现原理与编程技巧,通过分析特定字符串模式,讲解了如何判断字符串是否符合xPATx形式的规则,其中x为任意数量的A字符或为空。文章提供了AC代码示例,深入探讨了字符串中P、T字符的位置及A字符分布的数学关系。
摘要由CSDN通过智能技术生成

题目链接:

https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192

考点:

分析:

任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
那么正确的有这些:
PAT
APATA
AAPATAA
AAAPATAAA
...不说了,就是中间一个A左右加上等量的A(不加也行)都是正确的。

如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
拿上面的那几个正确的举例子,那么正确的有这些:
PAT —— 对于 aPbTc 来说ac是空,b是A。所以 PAAT 是正确的。同理PAAAAAT中间加多少个A都是正确哒~
APATA —— 对于aPbTc来说,abc都是A。所以 APAATAA 是正确的。再类推一下,那么 APAAATAAA 是正确的。
AAPATAA —— 对于aPbTc来说,a和c是AA,b是A。所以AAPAATAAAA是正确的,再类推一下,AAPAAATAAAAAA 是正确的~ 
所以说规律就是,可以在P和T中间加A并且在T后面加A,要求必须是,中间加上一个A,末尾就得加上几倍的(P前面A的那个字符串)。换句话说就是,中间的A的个数如果是3,那么末尾的A的个数就得是开头A的个数的3倍。很巧,当中间A为一个的时候,末尾和开头A的个数必须相等正好是第二条的要求~~~

所以一句话总结字符串的要求:只能有一个P一个T,中间末尾和开头可以随便插入A。但是必须满足开头的A的个数 * 中间的A的个数 = 结尾的A的个数,而且P和T之间不能没有A~

(原文:https://blog.csdn.net/liuchuo/article/details/51994881 )

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        char str[100];
        scanf("%s",str);
        int len=strlen(str);
        int lt,lp,nt=0,np=0,other=0;
        //前两个记录位置,后两个记录个数,记录除字母A以外的其他字母
        for(int i=0;i<len;i++){
            if(str[i]=='P'){
                lp=i;
                np++;
            }
            else if(str[i]=='T'){
                lt=i;
                nt++;
            }
            else if(str[i]!='A'){
                other++;
            }
        }
        if(other>1||nt!=1||np!=1||(lt-lp)<=1){//P与T中间至少有一个A所以lt-lp<=1,而不是(lt-lp)!=2
            printf("NO\n");
            continue;
        }
        int x=lp,y=lt-lp-1,z=len-lt-1;//分别计算各个区域内A的个数
        //对于z来说,长度len最小为1,假设字符串存在的话,
        //而字符串下标最小却为0,所以z=len-lt-1
        if(x*y==z){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值