PAT乙级1003JAVA题解
1003
1003 我要通过! (20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
-
字符串中必须仅有
P、A、T这三种字符,不可以包含其它字符; -
任意形如
xPATx的字符串都可以获得“答案正确”,其中x或者是空字符串,或者是仅由字母A组成的字符串; -
如果
aPbTc是正确的,那么aPbATca也是正确的,其中a、b、c均或者是空字符串,或者是仅由字母A组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (≤10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
输入样例:
10
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
APATTAA
结尾无空行
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
NO
结尾无空行
分析
第一个条件是必须含有P A T三个字母,第二个条件是字母P T中间含有一个A,然后两边都是空串才是正确,或者两边都是长度相同的A串才为正确,第三个条件是a b c都是A的串或者都是空串,假设都为A的串,在aPbTc正确的条件下,在P和T中间增加了一个A字符,然后只有aPbATca的情况下才为正确,从这里可以发现P和T中间增加了一个A字符,就增加了一个a长度的A串,所以发现规律,c串的长度等于a串的长度乘以b串的长度。本题最重要的是发现第三个条件的这个规律,然后结合三个条件进行编程,所有输入的字符串都可以转化为aPbTc字符串类型来判断。
import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n,p,t; int value=0; n=sc.nextInt(); Map<Character, Integer> m=new HashMap<Character, Integer>();//用map集合来统计P T A三个字母的个数 m.put('A',0); m.put('P',0); m.put('T',0); m.put('X',0); String s;//定义每次要输入的字符串 int lenA=0;//aPbTc这种类型对应的三种A串的长度,lenA对应a int lenB=0;//对应b int lenC=0;//对应c int[] a=new int[n+1];//设置一个数组,来判断每一次输入的字符串是否满足三个条件,满足的话,让对应的值为1,否则为0 for(int i=1;i<=n;i++){ s=sc.next(); for(int j=0;j<s.length();j++){ if(s.charAt(j)=='A'){//统计A串的个数 value=m.get('A'); value++;//让A串的长度加1 m.put('A',value); } else if(s.charAt(j)=='P'){//在依次遍历每一个字符的时候,遇到了P字符,就是可以得带a串的长度,lenA value=m.get('P');//统计P出现的次数 value++; m.put('P',value); lenA=m.get('A'); m.put('A',0);//求出了a串的长度后,让map集合中的A的个数为0,之后统计b串的长度 } else if(s.charAt(j)=='T'){//在依次遍历每一个字符的时候,遇到了P字符,就是可以得带b串的长度,lenB value=m.get('T');//统计T出现的次数 value++; m.put('T',value); m.put('T',1); lenB=m.get('A'); m.put('A',0);//求出了b串的长度后,让map集合中的A的个数为0,之后统计c串的长度 }else{ value=m.get('X');//用x字符来代替出现的其他字符的统计 value++; m.put('X',value); } } lenC=m.get('A');//一次遍历后,map集合中A键对应的值为c串的长度 if(lenC==lenA*lenB&&m.get('P')==1&&m.get('T')==1&&m.get('X')==0&&lenB!=0){ //判断条件三 在只有一个P T的情况下才是正确 判断是否有其他字符,没有启发字符才是正确 判断有没有整个字符串A字符,判断条件一 a[i]=1; } m.put('A',0);//让集合数据为零,重新计算下一个字符串的情况 m.put('P',0); m.put('T',0); m.put('X',0); lenA=0;//将统计a b c串的长度归零,统计下一个字符串的情况 lenB=0; lenC=0; } for(int i=1;i<=n;i++){//依次输出结果 if(a[i]==1){ if(i==n){ System.out.print("YES"); }else { System.out.println("YES"); } }else{ if(i==n){ System.out.print("NO"); }else { System.out.println("NO"); } } } } }
浙公网安备 33010602011771号