PAT (Basic Level) Practice (中文)--1003 我要通过! (java)

本文介绍了PAT基础级实践中的1003题,题目要求编写程序判断输入的字符串是否满足特定条件以获得'答案正确'。条件包括字符串仅包含P、A、T字符,形如aPbTc,其中c等于a乘以b。文章提供了问题分析和Java代码实现。
摘要由CSDN通过智能技术生成

目录

1 题目

2 分析

3 代码--java 


返回    PAT (Basic Level) Practice (中文)练习目录导航


1 题目

1003 我要通过! (20 分)

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

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

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

首先,将题目给的条件分为1、2 两部分,有点类似数学归纳法的步骤(如下如图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

图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;
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值