PTA basic 1003 我要通过! (20 分) c语言实现(gcc)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES YES YES YES NO NO NO NO
解题思路
1.第一眼没看懂规律, 观察发现字符串只会出现一个P和一个T以及若干A, PT中间必须有A,只能出现PTA三种字符
2.提交后通过5/8, 搜索题目后发现在P前面的A(暂记a0)和PT中间的A(暂记a1)以及在T后面的A(暂记a2)是有规律的 a0*a1==a2
参考文章 https://blog.csdn.net/liuchuo/article/details/51994881
3.再次提交后通过7/8,测试发现PT必须按照,P在先T在后的顺序,修改后通过
1 #include "stdio.h" 2 #include "stdlib.h" 3 #include "string.h" 4 5 int match(); 6 int match(char *str){ 7 int i,countP=0,countT=0,a[]={0,0,0}; 8 if(strlen(str)<3)return -1; 9 for(i=0;i<strlen(str);i++){ 10 if((str[i]-'P')==0||(str[i]-'A')==0||(str[i]-'T')==0){//仅出现PTA三中字符,否则返回0 11 if((str[i]-'P')==0&&countT==0)countP++;//T前面出现P 12 if((str[i]-'T')==0)countT++; 13 if((str[i]-'A')==0&&countP==0&&countT==0){//计数P前面的A 14 a[0]++; 15 }else if((str[i]-'A')==0&&countT==0&&countP==1){//计数PT中间的A 16 a[1]++; 17 }else if((str[i]-'A')==0&&countT==1&&countP==1){//计数T后面的A 18 a[2]++; 19 } 20 }else{ 21 return 0; 22 } 23 } 24 if(countP==1&&countT==1&&(a[0]*a[1]==a[2])){//P在前T在后且仅出现一次,同时满足a[0]*a[1]==a[2],返回1 25 return 1; 26 } 27 return 0; 28 } 29 int main(){ 30 int n,i; 31 scanf("%d",&n); 32 char s[11][101]; 33 if(n){ 34 for(i=0;i<n;i++){ 35 scanf("%s",s[i]); 36 } 37 } 38 for(i=0;i<n;i++){ 39 if(match(s[i])>0){ 40 printf("YES\n"); 41 }else{ 42 printf("NO\n"); 43 } 44 } 45 return 0; 46 }