PAT乙级 1003 我要通过
题目
分析
一、这一题需要按照格式输出 PAT
, PAAT
, AAPATAA
, AAPAATAAAA
等字符串,符合要求输出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();
}
}