题目:我要通过!
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
输入格式:
每个测试输入包含 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
解题思路:
通过阅读题目,可以得到若想要输出“答案正确”,有以下两种可能:①(A*n)PAT(A*n) ②(A*n)PAAT(A*2n),其中n为任意非负整数。所以我们设置了两个变量num_A_in和num_A_out分别用于保存PAT或PAAT前和后的A的个数,若满足情况①,则必须满足num_A_in = num_A_out且中间字符串依次是PAT;若满足情况②,则必须满足num_A_in * 2 = num_A_out且中间字符串依次是PAAT,除此之外的情况均输出“答案错误”。值得注意的是,在利用数组的时候必须要先判断是否此时的数组有效,不能超出数组的范围!
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
string str;
for (int i = 0; i < n; i++) {
cin >> str;
int num_A_in = 0; // 记录开头的'A'的个数
// 统计开头的'A'的个数
while (num_A_in < str.length() && str[num_A_in] == 'A') {
num_A_in++;
}
// 第一种情况 A*nPAT*n
if (str.length() - num_A_in >= 3 && str[num_A_in] == 'P' && str[num_A_in + 1] == 'A' && str[num_A_in + 2] == 'T') {
int num_A_out = 0;
// 统计末尾的'A'的个数
while (num_A_in + 3 + num_A_out < str.length() && str[num_A_in + 3 + num_A_out] == 'A') {
num_A_out++;
}
// 判断是否符合条件
if (num_A_in == num_A_out && num_A_in + 3 + num_A_out == str.length()) {
cout << "YES" ;
} else {
cout << "NO" ;
}
}
// 第二种情况 A*nPAAT*n
else if (str.length() - num_A_in >= 4 && str[num_A_in] == 'P' && str[num_A_in + 1] == 'A' && str[num_A_in + 2] == 'A' && str[num_A_in + 3] == 'T') {
int num_A_out = 0;
// 统计末尾的'A'的个数
while (num_A_in + 4 + num_A_out < str.length() && str[num_A_in + 4 + num_A_out] == 'A') {
num_A_out++;
}
// 判断是否符合条件
if (2 * num_A_in == num_A_out && num_A_in + 4 + num_A_out == str.length()) {
cout << "YES";
} else {
cout << "NO";
}
}
// 其他情况均为 "NO"
else {
cout << "NO" ;
}if(i!=n-1)
{
cout<<endl;
}
}
return 0;
}