题目链接:
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;
}