闲聊:拿到题目一脸懵逼,心中直接握草,算了,还是耐心好好学吧!
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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
浅析(具体分析看代码)
1、P A T 三个字母必须都有,且只有这三个字母 且 P T 只能出现一次;
2、P 和 T 之间必须至少有一个A;
3、P前A的数量*P、T之间A的数量=T之后A的数量(P、T之间至少一个A)。
代码(大佬代码,直接看吧,一开始没有开懂,可以直接跳过,看我下面学习的代码)
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
while (n--) {
char a[100] = { 0 };
cin >> a;
int len = strlen(a);
int p = 0, t = 0, left = 0, mid = 0, right = 0;
for (int i = 0; i < len; i++) {
if (a[i] == 'A' && p == 0 && t == 0) {//左
left++;
continue;
}
else if (a[i] == 'P') {//p
p++;
continue;
}
else if (a[i] == 'A' && p > 0 && t == 0) {//中
mid++;
continue;
}
else if (a[i] == 'T') {//t
t++;
continue;
}
else if (a[i] == 'A' && p > 0 && t > 0) {//右
right++;
continue;
}
else
break;
}
if (p == 1 && t == 1 && mid != 0 && left * mid == right)// aPATa
printf("YES\n");
else if (p == 1 && t == 1 && mid == 1 && left == 0 && right == 0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
下面是我从“0”开始学习的代码,大家可以可以参考
#include <iostream>
#include <map>
using namespace std;
int main() {
int n, p = 0, t = 0;
string s;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s;
map<char, int> m; //将字符串char转化为整型int
for (int j = 0; j < s.size(); j++) {
m[s[j]]++; //得到字符串中各个字符的数量
if (s[j] == 'P') p = j; //得到P在字符串中的位置;
if (s[j] == 'T') t = j; //得到T在字符串中的位置
}
/*
1、P,T只有一个;
2、A的数量不能为0;
3、字符串的长度要大于3;
4、P,T之间至少有一个A;
5、P前A的数量*P,T之间的数量=T之后的数量!!!
*/
if (m['P'] == 1 && m['A'] != 0 && m['T'] == 1 && m.size() == 3 && t - p != 1 && p * (t - p - 1) == s.length() - t - 1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
Tips:
map
基本格式:
#include <map>
map <类型,类型> 函数名
//将一个类型转化为另一类型
例如:本题中map<char,int>m,就是将char转化为int,并且命名为m,下面引用时就可以对字符串中的字符进行计数。