目录
返回 PAT (Basic Level) Practice (中文)练习目录导航
1 题目
1003 我要通过! (20 分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
- 字符串中必须仅有
P
、A
、T
这三种字符,不可以包含其它字符; - 任意形如
xPATx
的字符串都可以获得“答案正确”,其中x
或者是空字符串,或者是仅由字母A
组成的字符串; - 如果
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
YES
NO
NO
NO
NO
2 分析
首先,将题目给的条件分为1、2 两部分,有点类似数学归纳法的步骤(如下如图2)
首先第一部分(绿色框)里的条件1是很容易理解的;条件2,也不难分析:当x为空时,字符串就变成了“PAT”,,当x为“A”时,字符串变成“APATA”,好像看到这里只能得出“P”和“T”两边的A的个数相等;
接下来看第二部分(黄色框)的条件3,该条件如果成立,那么“aPbTc”就应该满足第一部分的条件(绿色框):仅有P、A、T三种字符,形如“xPATx”,从而将“其中 a
、 b
、 c
均或者是空字符串,或者是仅由字母 A
组成的字符串”这个条件范围缩小为“其中 a、
c
均或者是空字符串,或者a、b、c是仅由字母 A
组成的字符串”,第二部分(黄色框)条件3、4就变成“如果 aPATc
是正确的,那么 aPAATca
也是正确的”;下面接着看条件4,如果条件4成立,同理,应该满足 第一部分的条件(绿色框),此时看图3
此时,根据图三可以得出规律:“T”后面“A”的个数=“P”前面“A”个数 * “P”、“T”之间“A”的个数
将条件进行总结:1、仅有P、A、T三种字符,不含其它字符;2、形如 aPbTc,其中c=ab(a、b、c指A的个数),a、c可以是是空字符串,b不可是空字符串,a、b、c是仅由字母 A
组成的字符串.
3 代码--java
import java.util.Scanner;
/**
* @Description 1003我要通过
* @author hmm7
* @version v1.0
* @date 2019年8月23日 上午11:50:26
*/
public class Main {
private static Scanner sc;
private static int StringLength;
private static String[] strinput;
private static String[] judgeresult;
public static void main(String[] args) {
String[] inputresult=inputString();
String result[]=judge(inputresult);
for(int i=0;i<StringLength;i++) {
System.out.println(result[i]);
}
}
/**
* 输入字符串
* @return
*/
public static String[] inputString() {
sc = new Scanner(System.in);
StringLength=sc.nextInt();
strinput=new String [StringLength+1];
strinput[0]=String.valueOf(StringLength);
for(int i=1;i<StringLength+1;i++) {
strinput[i]=sc.next();
}
return strinput;
}
/**
* 判断字符串
* @return
*/
public static String[] judge(String[] str) {
judgeresult=new String [StringLength];
for(int i=1;i<StringLength+1;i++) {
int pnum=0;
int tnum=0;
int anum=0;
int pindex=0;
int tindex=0;
for(int j=0;j<strinput[i].length();j++) {
if(strinput[i].substring(j,j+1).trim().equals("P")){
pnum++;
pindex=j;
}
if(strinput[i].substring(j,j+1).trim().equals("T")){
tnum++;
tindex=j;
}
if(strinput[i].substring(j,j+1).trim().equals("A")){
anum++;
}
}
if(pnum!=1&tnum!=1){
judgeresult[i-1]="NO";
}else if(pnum+anum+tnum!=strinput[i].length()){
judgeresult[i-1]="NO";
}else if(tindex-pindex==1){
judgeresult[i-1]="NO";
}
else{
if(pindex*(tindex-pindex-1)==strinput[i].length()-tindex-1){
judgeresult[i-1]="YES";
}else{
judgeresult[i-1]="NO";
}
}
}
return judgeresult;
}
}