题目1003 我要通过!
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P、 A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
输入样例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
思路
由题意得三个条件是相与的,表示同时满足。
条件一:字符串中有且仅有P、A、T三个字符组成。
条件二:字符串可以是PAT外的对称结构或者PAT外两边的要求为字符串A或空。
条件三:我们可以将a、b、c看成三个不同的位置,从“答案正确”的输入样例分析:
个人理解:PT间加字符串A并且在字符串尾部加入a位置的字符串。
1)PAT对于aPbTc而言,我们可以看成a、c位置为空,b位置为字符串A。
2)根据条件aPbATca正确得出正确答案:PAAT。
3)同理,PAAT对于aPbTc而言,a、c位置为空,b位置为字符串AA。
4)根据条件aPbATca正确得出正确答案:PAAAT。
结论一:
PT之间增加不论多少个A都是正确的,即
,
6)同理,AAPATAA对于aPbTc而言,a、c位置为字符串AA,b位置为字符串A。
7)根据条件aPbATca正确得出正确答案:AAPAATAAAA。
8)同理,AAPAATAAAA对于aPbTc而言,a位置为字符串AA,c位置为字符串AAAAb位置为字符串AA。
9)根据条件aPbATca正确得出正确答案:AAPAAATAAAAAA。
分析三个正确答案:AAPATAA、AAPAATAAAA、AAPAAATAAAAAA可得
结论二:
a位置字符串A的个数 b位置字符串A的个数 c位置字符串A的个数,即
此结论同样满足结论一;至此,附加条件字符串只有一个P和T,题目清晰。
代码
#include <stdio.h>//scanf
#include <string.h>//strlen
int main(){
int n, k;
scanf("%d", &n);
char c[101]= {'\0'};//初始化
while(n--){
scanf("%s", c);//接收字符串
int len= strlen(c);//定义字符串长度
int p= 0, t= 0, a= 0, right= 0, b= 0;
for(int i= 0; i< len; i++){//遍历字符串
//统计各个位置的字符串长度
if(c[i]== 'A' && p== 0 && t== 0){//左边
a++;
continue;
}
else if(c[i]== 'P'){
p++;
continue;
}
else if(c[i]== 'A' && p> 0 && t== 0){
b++;
continue;
}
else if(c[i]== 'T'){
t++;
continue;
}
else if(c[i]== 'A' && p> 0 && t> 0){
right++;
continue;
}
else break;
}
if(p== 1 && t== 1 && b!= 0 && a*b== right){
printf("YES\n");
}else printf("NO\n");
}
return 0;
}
总结
只有理解透题目,才能更好地AC。
感恩指正,点个赞吧~