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 }
View Code

 

但是如果这样写,会有一个测试点不通过,显示为“返回非零”。还希望大家看后指点一下。

posted on 2013-05-20 22:46  FTD2012  阅读(1640)  评论(4编辑  收藏  举报

导航