题目如下:
1003 我要通过! (20分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
①字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
②任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
③如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
一一一一一一一一一一一一一一一一一一一一一一一一一一
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
一一一一一一一一一一一一一一一一一一一一一一一一一一
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
一一一一一一一一一一一一一一一一一一一一一一一一一一
输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
一一一一一一一一一一一一一一一一一一一一一一一一一一
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
首先读题,我们可以了解到这道题目想要我们做的事情就是一点:对字符串的模式进行判断。
判断字符串的模式,说到底其实就是你必须要找到符合题目所给条件、可以运用到题中所给输入输出样例的字符串的规律。那么接下来,我们就来找这个字符串的规律。
一切先从第一个条件开始:
①字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
第一个条件很简单,要求字符串中不允许出现除了P、A、T以外的字符,这也是为什么样例输入中Whatever、xPATx出错的原因。相信大家都知道如何判断出现了其他字符的情况,可以设置一个布尔型标识符变量,在循环遍历一遍数组的时候,如果遇到了条件以外的字符就把这个布尔型变量设置为false,在最后输出的时候进行判断就可以了。
让我们来看看第二个条件:
②任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
不难看出,第二个条件给出了第一个有关于该字符串模式的具体例子。根据该条件我们可以推断出,如果某个字符串中间含有“PAT”这样的内容,而且“PAT”的两边要么是空串、要么是数量相等的含A的字符串,那么这个答案就正确。
一般来说看到这里,相信大家脑子里应该都有了少许思路,即对于第二个条件的字符串模式的判断大致可以怎么做,可能大家都多多少少有一两种解决办法(无论是否高效,反正解决办法脑海里是浮现了的)。那么请大家带着你们自己脑海里的解决办法,再往下看看第三个条件:
③如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
相信还是有很多人会卡在第三个条件这里。如何正确理解第三个条件呢?如果单单只是看第三个条件的话,要么看不懂,要么会得到一个错误的解决方法,以至于无论如何提交都会得到答案错误的结果。这就要求我们再次结合题目来仔细分析第三个条件究竟想要告诉我们什么。
首先,第三个条件的开头就告诉我们,如果“aPbTc”是正确的,那么它究竟要怎样才能是正确的呢?我们不妨回头看看前面两个条件:①只包含P、A、T三种字符;②形如xPATx。很显然,在字符串aPbTc中并没有包含字符A,这也就是说只在考虑第一个条件的时候