我要通过
1 字符串中必须仅有 P、 A、T这三种字符,不可以包含其它字符;
2 任意形如 xPATx的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3 如果 aPbTc 是正确的,那么aPbATca也是正确的,其中a、 b、 c均或者是空字符串,或者是仅由字母 A 组成的字符串。
分析
条件1 是基础 只能含有 P A T
条件2 是最先的判断条件 () PAT () ()可以是空,也可以是几个A
条件3 是在2的基础上进行递推 如果aPbTc是正确的,在此之前只有2能判断正确,所以第一步只能确定b=1A 满足2 PAT 然后再设置 a c 的值 又因为2 所以第一步a=c 再从这个基础上推aPbATca 和改变b的值
PAT->PAAT
APATA->APAATAA->APAAATAAA
AAPATAA->AAPAATAAAA
必须含有 P A T 三个字符&&P前面A的个数 * P T之间A的个数 = T后面A的个数&&PT之间必须有A
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //几个字符串待检查
for (int i = 0; i < n; i++) {
String s = sc.next();
// 1.只有PAT这三种字符。2.xPATx是正确的
//matches方法检查整个字符串是否符合给定的正则表达式模式
//正则表达式 A* 0或多个A P出现一次 A+至少一个A T出现一次
boolean isRight = s.matches("A*PA+TA*");
// 3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的。即a*b=c
// 获取第一次出现P的索引下标; 就是P前面A的个数,如果P为2,则前面A的个数为2
int a = s.indexOf("P");
int index = s.indexOf("T");
// 获取T前面A的个数 -1是减去P
int b = index - a - 1;
// 获取T后面A的个数 -2 减去P和T
int c = s.length() - a - b - 2;
System.out.println(isRight && (a * b == c) ? "YES" : "NO");
}
}
}