目录
1.说在前面
拿到一个编程题,如果一时间没有很好的解题思路,可以去尝试把题目分解。
例如哪个地方需要一个读入哪个地方需要一个输出以及如何实现等,在我们手写的过程中就会认清这个题目要考我们的是什么。
我建议最好是去动手写一写题目的需求,这样不仅可以帮助我们理清解题思路还可以锻炼我们的编程思维,慢慢从手写→心写。
2.看题目
说实话这道1003最恼人的就是题目,理解题意比解题难很多。
我们来逐句分解一下:
1.字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符;解:顾名思义,存在且只能存在 P、A、T 三种字符!出现其他直接NO!!!
2.任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串;解:如果x是空字符串就是最基本的 P A T,就算两侧有东西也只能是A,
不可以是PP PAT PP,所以我们可以间接的理解为A可以多个,P和T只能有一个。
3.如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。解:题目说 aPbTc ,别急我们代入一下A,aPbTc == APATA
再看 aPbATca ,abc为空字符串那就是原型,代入A之后,aPbATc == APAATAA 。
为了更加直观我们引入几个可以获得YES的输入样例:
PAAT、AAPATAA、AAPAATAAAA
稍加观察我们可以发现,位于左中右的A呈:左A * 中A == 右A 的情况。
思路整理:
有且仅有 P、A、T 三个字母。
P和T各一个。
左A * 中A == 右A 。
读懂题意,理清思路后这道题约等于over了(代码仅供参考,看完自己盲写一下)
注释已经添加好方便大家理解,30行代码绝对够用~~
3.看代码
#include <stdio.h>
#include <string.h>
int main(void) {
char str[101];
int i,j,count;
int numa1 = 0, numa2 = 0, numa3 = 0, nump = 0, numt = 0; //a1,a2,a3为左中右A的数量
scanf("%d", &count); //读入输入的整数
for (j = 0; j < count; j++, numa1 = 0, numa2 = 0, numa3 = 0, nump = 0, numt = 0) { //循环读入字符串并初始化计数
scanf("%s", str);
for (i = 0; i < strlen(str); i++) { //遍历数组计算P、A、T的个数
if (str[i] == 'A' && nump == 0)
numa1++;
else if (str[i] == 'P' && numt == 0) //记录P的存在以及保证其在T前面
nump++;
else if (str[i] == 'A' && nump != 0 && numt == 0)
numa2++;
else if (str[i] == 'T' && numa2 != 0) //记录T的存在并保证中间A的存在
numt++;
else if (str[i] == 'A' && nump != 0 && numt != 0)
numa3++;
else
break;
}
if (nump == 1 && numt == 1 && numa2 > 0 && numa1 * numa2 == numa3) { //输出条件
printf("YES\n");
continue;
}
printf("NO\n");
}
return 0;
}
(一行可以不加大括号)
4.结语
此题难在理解题意,其他并没什么特殊之处,我第一次看到这道题的时候恶心好久因为自己根本不想读(其实有点读不懂),可是别人都能顺利通过自己就一定能,希望大家在日常刷题的过程中不要被纸老虎吓到。
小白别忘了去盲打一遍 bye