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
思路:
此题关键在于条件三的理解。
若按条件二输入“PAT”,则按aPbTc格式转换时,a=null,b=A,c=null。再以此a,b,c的值代入aPbATca中,得到“PAAT”,此时,a=null,b=AA,c=null。若继续代入,会得到“PAAAT”……总结可得正则表达式pattern2
若按条件二输入“APATA”,则按aPbTc格式转换时,a=A,b=A,c=A。再以此a,b,c的值代入aPbATca中,得到“APAATAA”,此时,a=A,b=A,c=A。若继续代入,会得到“APAAATAAA”……总结可得正则表达式Pattern1,及
P前A个数*P至T之间A个数=T后A个数
若符合此条件,则输出“YES”,否则输出“NO”
思路参考:https://blog.csdn.net/zhouhuakang/article/details/50756195
package com.PAT; import java.util.Scanner; public class Main_1003 { public static void main(String[] args) { int n; //输入数字个数 String pattern1= "A*PA+TA*"; //创建对比正则表达式 String pattern2= "PA+T"; //a=null c=null Scanner sc= new Scanner(System.in); n= sc.nextInt(); String[] arr= new String[n]; //字符串存储数组 for (int i=0; i<n; i++) { arr[i]= sc.next(); } for (int i=0; i<arr.length; i++) { if (arr[i].matches(pattern2)) { System.out.println("YES"); }else if (arr[i].matches(pattern1)) { String[] a= arr[i].split("P|T"); int alength= a[0].length(); //P前面A的个数 int blength= a[1].length(); //P至T之间A的个数 int clength= a[2].length(); //T之后A的个数 if (alength*blength == clength) { System.out.println("YES"); }else { System.out.println("NO"); } }else { System.out.println("NO"); } } sc.close(); } }