题目描述
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 – 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
aPbTc
是正确的,那么aPbATca
也是正确的,其中a
、b
、c
均或者是空字符串,或者是仅由字母A
组成的字符串。
现在就请你为 PAT
写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
思路解析
- 条件1就没什么说的,注意不要有非法字符,可以用一个计数器专门记录非法字符,一旦有就是NO。
- 在条件1的基础上,条件2说的是P之前的空字符或者A的数量要等于T之后的空字符或者A字母数量,由于这里P和T只出现一次,因此if判断找到这两个P、T字母之后计算前后数量相等就可以了。
- 条件三说的是P左边一个,PT中间两个,T之后两个。因此条件2三综合就是P左边的A或者空字符数量乘PT中间的数量等于T右边的数量。
看了我好久,语文没学好就是这下场。
C++实现
#include <iostream> #include<string> #include <stdio.h> using namespace std; void Solve(string input){ int num_of_P =0; // 记录P的个数 int local_of_P =0; // 记录P的位置,之后好计算之前A与空格的个数 int num_of_T =0; // 记录T的个数 int local_of_T =0; // 记录T的位置,之后好计算T之后A与空格的个数 int other = 0; // 记录非法字符 for(int i=0; i < input.length(); i++){ if(input[i]=='P'){ num_of_P ++; local_of_P = i; } else if(input[i]=='T'){ num_of_T++; local_of_T =i; } else if(input[i]!='A' ){ other++; } } if(num_of_P !=1||num_of_T!=1||other||local_of_T-local_of_P<=1){ printf("NO\n"); // 有多个P,多个T,非法字符,以及P和T之间无A的情况 } else if((local_of_P)*(local_of_T-local_of_P-1)==(input.length()-local_of_T-1) ){ printf("YES\n"); // 考虑了上述几种特殊情况之后再来考虑正常情况 } else{ printf("NO\n"); // A的数量不满足要求的情况 } } int main(){ int n; cin>>n; string inputStr; for(int i=0;i<n;i++) { cin>>inputStr; Solve(inputStr); } return 0; }
Python实现
n = int(input()) def Solve(input_str): num_of_P = input_str.count('P') local_of_P = input_str.find('P') num_of_T = input_str.count('T') local_of_T = input_str.find('T') num_of_A = input_str.count('A') if num_of_P != 1 or num_of_T !=1 or len(input_string) != num_of_P+num_of_A+num_of_T or local_of_T-local_of_P <=1: print('NO') elif local_of_P*(local_of_T-local_of_P-1)==len(input_string)-local_of_T-1: print('YES') else: print('NO') for i in range(n): input_string = str(input()) Solve(input_string)