PAT乙级1003JAVA题解

1003

1003 我要通过! (20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;

  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;

  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 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");
               }
           }
       }
    }
}

 

posted @ 2022-01-10 17:40  猪能上树  阅读(40)  评论(0)    收藏  举报