浙江大学PAT (Basic Level) Practice (中文)1003我要通过!JAVA代码实现及其规律分析

1003

我要通过!

在这里插入图片描述

在这里插入图片描述这道题和1001,1002比起来难度其实并没有什么差别,我个人认为这道题主要是在于读懂题目的要求:
1、题目要求字符串中只能含有‘P’,‘A’,‘T’三种字符。
2、xPATx形式的字符串是正确的字符串,这条规则要求:
①‘P’和‘T’之间至少要有1个‘A’字符的存在
②类似PAT,APATA,AAPATAA,AAAPATAAA等等这些首尾‘A’数量相等的字符串是正确的
3、如果 aPbTc 是正确的,那么 aPbATca 也是正确的。
这句话稍微有些难理解,但是我们不妨按照上面第二条规则的要求推理一下:
①首先PAT是正确的,那么PAAT,PAAAT等等,这些也就都是正确的了
②APATA是正确的,那么APAATAA就是正确的
③AAPATAA是正确的,那么AAPAATAAAA就是正确的
④接下来用上面三点推出来的结果当做前提来看
APAATAA是正确的,那么APAAATAAA是正确的
AAPAATAAAA是正确的,那么AAPAAATAAAAAA是正确的

到了这里基本上的规律就可以总结出来了
设X是P之前A的数量,Y是P和T中间A的数量,Z是T之后的A的数量
那么这三者满足以下关系式:
X*Y=Z
特别地,当Y=0时,字符串不满足要求即为不正确字符串
且P和T都有且只有一个,多了不行,少了不行,并且P要在T之前出现
到了现在,相信大家也就都理解了这道题了
不过其实这道题我觉得使用正则表达式是比较简单的解法,但是相信大多数和我一样刚接触编程没多久的萌新都对正则表达式没有什么了解,所以我接下来的代码实现用的是比较繁琐的多重if判断情况,虽然代码量较多,但是应该比较浅显易懂。

话不多说,接下来就直接贴代码了:

import java.util.Scanner;

class pat
{
	public char a[]=new char[101];
	pat(String s)
	{
		a=s.toCharArray();
	}
	
}

public class Main {
	
    public static void main (String[]args) 
    {
    	pat P[]=new pat[101];
    	int n;
    	String temp;
    	Scanner input=new Scanner(System.in);
    	n=input.nextInt();
    	for(int i=0;i<n;i++)
    	{
    		temp=input.next();
    		P[i]=new pat(temp);
    	}
    	for(int i=0;i<n;i++)
    	{
    		System.out.println(checkOut(P[i]));
    	}
    }
    
    public static String checkOut(pat p)
    {
    	int pNumber=0;
    	int tNumber=0;
    	int sA=0;//位于P之前的A的数量
    	int mA=0;//位于中间的A的数量
    	int fA=0;//位于T之后的A的数量
    	for(char item: p.a)
    	{

    		if((item!='P')&&(item!='A')&&(item!='T'))
    		{
    			return "NO";
    		}
    		if(item=='P')
    		{
    			pNumber++;
    			if(pNumber>=2)
    			{
    				return "NO";
    			}
    			if((tNumber>0)&&(pNumber==0))
    			{
    				return "NO";
    			}
    		}
    		if(item=='T')
    		{
    			tNumber++;
    			if(tNumber>=2)
    			{
    				return "NO";
    			}
    		}
    		if(item=='A')
    		{
    			if(pNumber==0)
    			{
    				sA++;
    			}
    			if((pNumber==1)&&(tNumber==0))
    			{
    				mA++;
    			}
    			if((pNumber==1)&&(tNumber==1))
    			{
    				fA++;
    			}
    		}
    	}

    	if((sA*mA)==fA)
    	{
        	if((pNumber==0)||(tNumber==0))
        	{
        		return "NO";
        	}
    		if(mA==0)
    		{
    			return "NO";
    		}
    		
    		return "YES";
    	}

    	else
    	{
    		return "NO";
    	}
    	
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值