PAT 乙级 1003 我要通过!(JAVA)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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
NO
NO
NO
NO
我的思路:
这道题在乙级里面我认为是比较难的,代码实现是不难的,主要在于如何理解题目所说的三个条件。我们来逐一分析

1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符

条件1很容易理解,字符串如果有非 ‘P’ ‘A’ ‘T’之外的字符,那么这个字符串是不能通过的。

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

条件2实际上就是说这个字符串中间是"PAT",两边要对称。对称的规则是要么都是’A’,要么是空字符串

3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

条件三比较难理解,我们可以结合条件二来理解。首先不用管所谓的 a,b,c , 这只是代号而已,它们要么是仅有字母A组成的字符串,要么是空字符串,实质上和条件二的‘x’一样。 所以我们完全可以把 a和c换成x(因为依照条件二 a,c 必须一致,或为空字符串,或为仅有字符A组成的字符串)。好了,现在就变成了 xPbTx。依照条件二 b为‘A’,这时在b后面加一个‘A’,再在末尾加一个x。这时就变成了 xPAATxx,推算一下很容易发现规律
即 xPATx, xPAATxx, xPAAATxxx…都是正确的。

结合以上条件,我想大家也看出来了,只要P之前字符A的数量 X 乘上P和T之间字符A的数量 Y 等于T之后的字符A的数量Z即可。X可以为0,但是Y的数量不能为0。(Z的数量由X决定) 注意 P 和 T的数量只能为1。
下面附上我的代码:

import java.util.*;
public class Main{
    public static void main(String []args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<n;++i){
            String curStr=sc.next();
            char[]curChars=curStr.toCharArray();
            int pIndex=-1;//记录字符P的位置
            int tIndex=-1;//记录字符T的位置
            boolean flag=true;//判断是否符合条件
            for(int j=0;j<curChars.length;++j){
               if(curChars[j]!='A'&&curChars[j]!='P'&&curChars[j]!='T'){//这里是条件1,不符合直接跳出
                   flag=false;
                   break;
               }else if(curChars[j]=='P'){
                   if(pIndex!=-1){//判断P的数量是否只有一个
                       flag=false;
                       break;
                   }else{
                       pIndex=j;
                   }
               }else if(curChars[j]=='T'){
                   if(tIndex!=-1){//判断T的数量是否只有一个
                       flag=false;
                       break;
                   }else{
                       tIndex=j;
                   }
               }
            }
            if(flag){
                int m=tIndex-pIndex-1;//P和T之间字符A的数量
                int l=curChars.length-tIndex-1;//T之后字符A的数量
                if(m>0&&pIndex*m==l){//pIndex就是P之前字符A的数量
                    System.out.println("YES");
                }else{
                    System.out.println("NO");
                }
            }else{
                System.out.println("NO");
            }
        }
    }
}

如果您有更好更方便的方法,麻烦评论一下。我是菜鸟一个,希望得到进步。

猜你喜欢

转载自blog.csdn.net/qq_37774375/article/details/89915775