PAT 1003 我要通过! (Basic Level)
题目:
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:
8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA
输出样例:
YES YES YES YES NO NO NO NO
一开始没有看懂题目,提交了一次错误的。后来看了一下,第二个和第三个条件,得出:字符串中间的'A'的个数可以随意个,但是每增加一个,在'T'右边的'A'个数就要增加。增加的数量为'P'左边的'A'的个数。所以思路就是:将字符串分为3个部分,'P'左边的,'p'和'T'之间的,还有'T'右边的。这三部分必须都是由'A'或者空字符串组成。需要满足的条件就是:假设这三部分'A'的个数分别为a,b,c那么一定要满足c>=a*(b-1)。代码如下:
1 import java.util.*; 2 public class Main 3 { 4 public static void main(String args[]){ 5 Scanner cin = new Scanner(System.in); 6 int number = Integer.parseInt(cin.next()); 7 String[] input = new String[number]; 8 for(int i = 0;i < number;i++) 9 input[i] = cin.next(); 10 11 for(int i = 0;i < number;i++){ 12 String[] out = new String[3]; 13 out = divide(input[i]); 14 if(ifHasPT(input[i])){ 15 if(ifA(out[0]) && ifA(out[1]) && ifA(out[2]) && out[1].length() > 0){ 16 if(out[2].length() >= out[0].length() * out[1].length()) 17 System.out.println("YES"); 18 else 19 System.out.println("NO"); 20 } 21 else 22 System.out.println("NO"); 23 } 24 else 25 System.out.println("NO"); 26 } 27 } 28 29 public static Boolean ifHasPT(String s){ 30 int Pnum = 0; 31 int Tnum = 0; 32 for(int i = 0;i < s.length();i++){ 33 if('P' == s.charAt(i)) 34 Pnum++; 35 if('T' == s.charAt(i)) 36 Tnum++; 37 } 38 if(1 == Pnum && 1 == Tnum) 39 return true; 40 else 41 return false; 42 } 43 public static Boolean ifA(String s){ 44 if(s.length() == 0) 45 return true; 46 for(int i = 0;i < s.length();i++){ 47 if(s.charAt(i) != 'A') 48 return false; 49 } 50 return true; 51 } 52 public static String[] divide(String s){ 53 String[] result = new String[3]; 54 int Pindex = 0; 55 if(ifHasPT(s)){ 56 for(int i = 0;i < s.length();i++){ 57 if('P' == s.charAt(i)){ 58 result[0] = s.substring(0, i); 59 Pindex = i; 60 } 61 if('T' == s.charAt(i)){ 62 result[1] = s.substring(Pindex + 1,i); 63 result[2] = s.substring(i + 1,s.length()); 64 } 65 } 66 } 67 return result; 68 } 69 70 }
但是如果这样写,会有一个测试点不通过,显示为“返回非零”。还希望大家看后指点一下。