PAT-乙级-1033-我要通过!

╄→尐↘猪︶ㄣ 提交于 2020-01-29 12:48:15

题目描述

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

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

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 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

题目信息:

作者: CHEN, Yue

单位: 浙江大学

时间限制: 400 ms

内存限制: 64 MB

代码长度限制: 16 KB

分析

本题主要是对三个条件进行分析

仔细分析可以感觉到条件1,2,3具有嵌套关系

条件1是必须满足的,而且很容易写。

重点在对第2个条件和第3个条件的理解。

每个符合条件2的字符串,都能依据条件3继续推出新的字符串,而推出来的字符串又可以继续推下去。

所以可以试着列出几个,找规律。

PAT 这个字符串符合条件2, 则依据条件3推出的字符串为 PAAT,再继续推得 PAAAT,即:

PAT —> PAAT —> PAAAT —> PAAAAT

APATA —> APAATAA —> APAAATAAA —> APAAAATAAAA

AAPATAA —> AAPAATAAAA ----> AAPAAATAAAAAA ----> AAPAAAATAAAAAAAA

可以看出,符合条件的字符串aPbTc其中a、b、c的值总会满足 a * b = c这个关系

而且符合这个条件的只能有一个P和T

输入的大小写不能确定,所以也要在处理输入时将大小写统一

实现思路

  1. 读取字符串,将字符串统一成大写(或者小写)
  2. 确定每个字母都是“P”“A”“T”其中之一
  3. 确定只有一个“P”和“T”
  4. a * b = c,即(P前A的个数)* (PT之间A的个数)=(T后A的个数),可以使用P和T的索引来实现
  5. ”P“和"T"之间"A"的个数不能为0

代码实现-JAVA

import java.util.Scanner;

public class Main {
    public static void main( String[] args ) {
        Scanner sc = new Scanner(System.in);
        int time = sc.nextInt();
        sc.nextLine();

        String tempStr;

        int PAindex, TAindex,AAindex;

        for(int i = 0; i < time; i++){
            // 全变成大写 去掉空格
            tempStr = sc.nextLine().toUpperCase().replace(" ","");

            if(isPATConsits(tempStr)){
                // P前A的个数
                PAindex = tempStr.indexOf("P");

                TAindex = tempStr.indexOf("T");

                // PT之间A的个数
                AAindex = (TAindex - 1) - PAindex;

                // T后A的个数
                TAindex = tempStr.length() - 1 - TAindex;

                // PT之间A的个数不能为0
                if (PAindex * AAindex == TAindex && AAindex != 0){
                    System.out.println("YES");
                }
                else System.out.println("NO");
            }
            else System.out.println("NO");
        }
        sc.close();
    }

    private static boolean isPATConsits(String tempStr){
        char[] tempChar = tempStr.toCharArray();
        // 判断是否只由"P" "T" "A" 组成
        for(char eachChar : tempChar){
            if(eachChar != 'P' && eachChar != 'T' && eachChar != 'A')
                return false;
        }

        // 判断是否只有一个"P" 和 "T"
        int firstP =  tempStr.indexOf("P");
        int firstT = tempStr.indexOf("T");
        return firstP == tempStr.lastIndexOf("P") && firstP != -1
                && firstT == tempStr.lastIndexOf("T") && firstT != -1;
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!