“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 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
结尾无空行
通过测试条件:
- 字符串中仅有3种字符,分别是P、A、T;P和T有且仅有1个,A有一个及以上
- 字符P在字符T的前面,P与T之间至少有一个A
- 字符P之前有n1个A、P到T之间有n2个A,T之后有n3个A,则需满足n1 * n2 = n3
- 统计结果:
- 源码:
import java.util.Scanner;
/**
* @author Spring-_-Bear
* @create 2021/9/16 22:47
*/
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String[] strings = new String[10];
Main iWantPass = new Main();
/* 输入n */
int n;
n = scan.nextInt();
/* 输入n个字符串 */
for (int i = 0; i < n; i++) {
strings[i] = scan.next();
}
/* 调用方法进行判断 */
iWantPass.judge(strings, n);
}
public void judge(String[] strings, int n) {
int cntA, cntP, cntT, cntOthers; // 字符A、P、T和其它字符的个数
int indexP, indexT; // 字符P、T在字符串中的下标
int n1, n2, n3; // 字符P之前、P到T之间、T之后的字符A的个数
/* 外层循环依次遍历n个字符串;内层循环依次遍历当前字符串的每一个字符 */
for (int i = 0; i < n; i++) {
/* 每个字符串判断前赋初值 */
cntA = cntP = cntT = cntOthers = 0;
indexP = indexT = strings[i].length();
n1 = n2 = n3 = 0;
for (int j = 0; j < strings[i].length(); j++) {
/* 得到当前字符串的当前字符 */
char ch = strings[i].charAt(j);
/* 统计各种字符的个数,记录P、T字符在字符串中的下标 */
if (ch == 'P') {
cntP++;
indexP = j;
} else if (ch == 'T') {
cntT++;
indexT = j;
} else if (ch == 'A') {
cntA++;
} else {
cntOthers++;
}
/* 统计n1、n2和n3的个数 */
if (ch == 'A' && j < indexP) {
n1++;
} else if (ch == 'A' && j > indexP && j < indexT) {
n2++;
} else if (ch == 'A' && j > indexP) {
n3++;
}
}
/* 符合条件则输出YES:
* 1. 字符串中仅有3种字符,分别是P、A、T;P和T有且仅有1个,A有一个及以上
* 2. 字符P在字符T的前面,P与T之间至少有一个A
* 3. 字符P之前有n1个A、P到T之间有n2个A,T之后有n3个A,则需满足n1 * n2 = n3
*/
if (cntA >= 1 && cntP == 1 && cntT == 1 && cntOthers == 0 && n2 >= 1 && indexP < indexT && n1 * n2 == n3) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}