[PTA]1003 我要通过!

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 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
结尾无空行

通过测试条件:

  1. 字符串中仅有3种字符,分别是P、A、T;P和T有且仅有1个,A有一个及以上
  2. 字符P在字符T的前面,P与T之间至少有一个A
  3. 字符P之前有n1个A、P到T之间有n2个A,T之后有n3个A,则需满足n1 * n2 = n3
  • 统计结果:

[PTA]1003 我要通过!

  • 源码:
import java.util.Scanner;

/**
 * @author Spring-_-Bear
 * @create 2021/9/16 22:47
 */
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] strings = new String[10];
        Main iWantPass = new Main();

        /* 输入n */
        int n;
        n = scan.nextInt();

        /* 输入n个字符串 */
        for (int i = 0; i < n; i++) {
            strings[i] = scan.next();
        }

        /* 调用方法进行判断 */
        iWantPass.judge(strings, n);
    }

    public void judge(String[] strings, int n) {
        int cntA, cntP, cntT, cntOthers;    // 字符A、P、T和其它字符的个数
        int indexP, indexT;                 // 字符P、T在字符串中的下标
        int n1, n2, n3;                     // 字符P之前、P到T之间、T之后的字符A的个数

        /* 外层循环依次遍历n个字符串;内层循环依次遍历当前字符串的每一个字符 */
        for (int i = 0; i < n; i++) {

            /* 每个字符串判断前赋初值 */
            cntA = cntP = cntT = cntOthers = 0;
            indexP = indexT = strings[i].length();
            n1 = n2 = n3 = 0;

            for (int j = 0; j < strings[i].length(); j++) {
                /* 得到当前字符串的当前字符 */
                char ch = strings[i].charAt(j);

                /* 统计各种字符的个数,记录P、T字符在字符串中的下标 */
                if (ch == 'P') {
                    cntP++;
                    indexP = j;
                } else if (ch == 'T') {
                    cntT++;
                    indexT = j;
                } else if (ch == 'A') {
                    cntA++;
                } else {
                    cntOthers++;
                }

                /* 统计n1、n2和n3的个数 */
                if (ch == 'A' && j < indexP) {
                    n1++;
                } else if (ch == 'A' && j > indexP && j < indexT) {
                    n2++;
                } else if (ch == 'A' && j > indexP) {
                    n3++;
                }
            }

            /* 符合条件则输出YES:
             * 1. 字符串中仅有3种字符,分别是P、A、T;P和T有且仅有1个,A有一个及以上
             * 2. 字符P在字符T的前面,P与T之间至少有一个A
             * 3. 字符P之前有n1个A、P到T之间有n2个A,T之后有n3个A,则需满足n1 * n2 = n3
             */
            if (cntA >= 1 && cntP == 1 && cntT == 1 && cntOthers == 0 && n2 >= 1 && indexP < indexT && n1 * n2 == n3) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }
}
上一篇:1003 我要通过!(20 分)


下一篇:android:Intent匹配action,category和data原则