Day011 PAT乙级 1003 我要通过

PAT乙级 1003 我要通过

题目

分析

一、这一题需要按照格式输出 PATPAATAAPATAAAAPAATAAAA 等字符串,符合要求输出YES,否则输出NO

二、这一题的关键在于字符串的三个条件

  1. 字符串必须只能由P,A,T三个字母组成,不能多也不能少
  2. xPATx格式的字符串符合要求,x可以是任意数量的A
  3. 这个条件有点难理解
     ①“如果 `aPbTc` 是正确的”的意思是:在 `aPbTc` 符合条件2时,也就是a和c的数量相等,b等于A
     ②“那么 `aPbATca` 也是正确的”的意思是: `aPAATca` 也是正确的(此时, `aPAATca` 可以看成是新的 `aPbTc` ,套娃)

三、这题的关键在于寻找PAT中A出现的规律,不然如果硬做会很麻烦。把P前面的A称为a,PT中间的A称为b,T后面的A称为c,根据条件可以得到以下关系:

输入样例中正确的例子:

a b c
PAT 0 1 0
PAAT 0 2 0
AAPATAA 2 1 2
AAPAATAAAA 2 2 4

输入样例中错误的例子:

a b c
APAAATAA 1 3 2
APT 1 0 0

a从1增加到5:

a b c
APATA 1 1 1
AAPATAA 2 1 2
AAAPATAAA 3 1 3
AAAAPATAAAA 4 1 4
AAAAAPATAAAAA 5 1 5

a从1增加到5,b从1增加到5:

a b c
APATA 1 1 1
AAPAATAAAA 2 2 4
AAAPAAATAAAAAAAAA 3 3 9
AAAAPAAAATAAAAAAAAAAAAAAAA 4 4 16
AAAAAPAAAAATAAAAAAAAAAAAAAAAAAAAAAAAA 5 5 25

四、可以很明显地发现,a、b、c之间的关系是a*b=c。原因在于,a与c相等,b增加一个A,c就会变成 ca ,相当于乘2,增加两个A,c就会变成 caa ,相当于乘3,所以a*b可以算出c

五、弄清关系之后就可以开始写代码了

代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int num = cin.nextInt();

        while (num-- > 0) {
            String n = cin.next();//用字符串存储输入的字母
            int indexP = 0;//用于记录P在字符串中第几位
            int indexT = 0;//用于记录T在字符串中第几位
            boolean flag = true;

            for (int i = 0; i < n.length(); i++) {
                if (n.charAt(i) == 'P') {
                    indexP = i;//记录P的位置
                } else if (n.charAt(i) == 'T') {
                    indexT = i;//记录T的位置
                } else if (n.charAt(i) != 'A') {
                    flag = false;//判断字符串中是否还有PAT以外的字母
                    break;
                }
            }

            //flag为false说明字符串中还有其他字母,不符合要求
            //indexT - indexP - 1 > 0用于判断P和T之间是否有A,如果没有则不符合要求
            //indexT - indexP - 1表示P和T之间A的个数,indexP表示P之前A的个数,n.length() - indexT - 1表示T之后A的个数
            //如果a*b!=c则不符合要求
            if (flag && indexT - indexP - 1 > 0 && (indexT - indexP - 1) * indexP == n.length() - indexT - 1)
                System.out.println("YES");
            else
                System.out.println("NO");
        }
        cin.close();
    }
}

写到这里PAT的提交是能通过的

但是程序还有一个bug,那就是没有判断P和T的个数,例如:

想要解决很简单,创建两个变量用来记录P和T的个数,初始值为0,记录它们位置的同时个数也加1,正常情况下P和T的个数都是1,如果不等于1则说明不符合要求

package 乙级;

import java.util.Scanner;

public class _1003_我要通过 {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int num = cin.nextInt();

        while (num-- > 0) {
            String n = cin.next();
            int indexP = 0;
            int indexT = 0;
            int countP = 0;//记录P的个数
            int countT = 0;//记录t的个数
            boolean flag = true;

            for (int i = 0; i < n.length(); i++) {
                if (n.charAt(i) == 'P') {
                    indexP = i;
                    countP++;//每记录一次个数加1
                } else if (n.charAt(i) == 'T') {
                    indexT = i;
                    countT++;//每记录一次个数加1
                } else if (n.charAt(i) != 'A') {
                    flag = false;
                    break;
                }
            }

            //判断P和T的个数是否为1
            if (flag && indexT - indexP - 1 > 0 && countP == 1 && countT == 1 && (indexT - indexP - 1) * indexP == n.length() - indexT - 1)
                System.out.println("YES");
            else
                System.out.println("NO");
        }
        cin.close();
    }
}
原文地址:https://www.cnblogs.com/mooncell/p/14744865.html