1003. 我要通过!(20)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
----------------------------------------------------分割线------------------------------------------------------------
思路:条件一是必须满足的,而且很容易写。重点在对第2个条件和第3个条件的理解。
每个符合条件2的字符串,都能依据条件3继续推出新的字符串,而推出来的字符串又可以继续推下去。
所以可以试着列出几个,找规律。
PAT 这个字符串符合条件2, 则依据条件3推出的字符串为 PAAT,再继续推得 PAAAT,即:
PAT ---> PAAT ---> PAAAT ---> PAAAAT
APATA ---> APAATAA ---> APAAATAAA ---> APAAAATAAAA
AAPATAA ---> AAPAATAAAA ----> AAPAAATAAAAAA ----> AAPAAAATAAAAAAAA
可以看出,符合条件的字符串aPbTc其中a、b、c的值总会满足 a * b = c这个关系。
import java.util.Scanner; public class PAT_B_1003//PAT平台提交时需要把类名改为Main { public static void main(String[] agrs) { Scanner in = new Scanner(System.in);//读取所有输入 int n = in.nextInt();//读取输入的第一个数字,代表了后面输入的样例数 in.nextLine();//清除数字后的回车键 for(int i = 0; i < n; i++)//对每个样例都判断 { String str = in.nextLine();//输入的样例字符串 if(onlyPAT(str))//如果只含有PAT三种字符,则判断是否符合第2、3个条件 { if(aPbTc(str)) { yes();//符合输出YES } else { no();//不符合输出NO } } else//不止含有PAT三种字符,输出NO { no(); } } } public static void yes()//输出YES { System.out.println("YES"); } public static void no()//输出NO { System.out.println("NO"); } public static boolean onlyPAT(String str) {//将字符串遍历一遍,有不是PAT字符的则返回false for(int i = 0; i < str.length(); i++) { if(str.charAt(i) != 'P' && str.charAt(i) != 'A' && str.charAt(i) != 'T') { return false; } } return true; } public static boolean aPbTc(String str) { int a = str.indexOf("P");//aPbTc 字符串中,a的值,代表字符P前面的A个数 int c = str.length() - str.indexOf("T") - 1;//aPbTc 字符串中,c的值,代表字符T后面A的个数 int b = str.indexOf("T") - str.indexOf("P") - 1;//aPbTc 字符串中,b的值,代表P和T中间A的个数 if((b == 0 ) || (a * b != c))//通过样例可知b不能为0 return false; else return true; } }