当前位置: 代码迷 >> 综合 >> PAT 乙级 1003 我要通过!(JAVA)
  详细解决方案

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

热度:86   发布时间:2023-11-24 15:49:52.0

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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");}}}
}

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

  相关解决方案