1003 我要通过!(20分)
1003 我要通过! (20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
-
字符串中必须仅有
P、A、T这三种字符,不可以包含其它字符; -
任意形如
xPATx的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是仅由字母A组成的字符串; -
如果
aPbTc是正确的,那么aPbATca也是正确的,其中a、b、c均或者是空字符串,或者是仅由字母A组成的字符串。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
输入样例:
9
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
分析:该题是一个字符串判断,处于内存大小考虑,本次采用依次读取字符处理的方式。题目的判断在三个条件之中,下面依次分析分析题目给出的三个条件:
第一个条件要求字符串中必须含有P、A、T三个字符,因此可以采取在输入字符时注意判断字符,若字符为P、A、T之一,则将对应的计数整数加一,若出现了其他字符,则将字符标识归零。
第二个条件为"xPATx"格式,x代表多个A字符串或空字符串,在PAT两端x字符串相同,可以单纯将前后两部分看作相同数目A组成的字符串,令两端字符串长度同时为a(a>=0),因此整体中三部分A字符串可以看作a*1=a的形式。
第三个条件为"如果 aPbTc 是正确的,那么 aPbATca 也是正确的",本一条件主要规范了对字符串的化简,具体判断还是由前两条条件所规定,因此主要注意该条件中对字符串的化简,这里需要注意字符串整体可以多次简化求解,即"AAPAAAATTAAAAAA"一次简化为"AAPAATAAAA"不能确定结果,再次简化后得出的字符串"AAPATAA"即可符合第二个条件,因此源字符串"答案正确",与第二个条件相似,所有的a、b、c都可以看作零个或多个A所组成的字符串,因此可以看出PT前后两部分(令前中后各部分A字符串长度分别为a、b、c)完全符合a*b=c的公式。
综合上述各条件分析,可以看出判断字符串可以从字符种类、统计三部分字符串长度并据a*b=c公式判断,但同时需要注意PT间的A字符串长度必须大于等于零,且PT顺序必须是P位于T前,因此在判断时需要加上这些条件,综合所有分析便可以得出以下代码:

在pta刷题时刷到了这道题,看到第三个条件一开始打算递归调用第二条件实现,但最后查阅了大佬的博客才发现了字符串之间的数学规律,因此写了这个随笔作为记录。
浙公网安备 33010602011771号