pat乙级1003 我要通过

在这里插入图片描述
pat甲级题目基本都是一堆废话,读懂了题目意思就非常简单了,要解决此题必须要发现其中的规律。
1.由条件1可知,字符串必须仅有P、A、T三种字符,且三种必须都要包含。
2.由条件2可知有下图中的结论
在这里插入图片描述
其中 N可以为0。
此时结合1 、2 可知 可能的形式为下图 其中前后橙色的A数量可以为0 但必须相等,中间红色的A数量必须大于1即可。
在这里插入图片描述
3.由2中结论可知,aPbTc必须满足ac要不为空,要不为AA…A形式,但如果为空的话,由条件3又可知b也必须为空,此时aPbTc就是PT的形式,明显不是正确的形式,所以ac只能为AA…A形式,但ac中A的个数必须相等。b必须满足是AA…A形式,A的个数大于1即可。而由aPbTc到aPbATac可以看到a’ =a;
b’=b+A;c’=c+a,故有下图情况。黑色A的个数A(黑)与橙色A的个数A(橙),已经红色A的个数A(红)满足条件, A(黑)/A(橙)==A(红),除此之外,P T个数有且只有一个 ,并且P在T之前。
在这里插入图片描述

#include<iostream>
using namespace std;
#define maxsize 100
#include <string.h> 
bool isPAT(char *a,int len)
{
	if(a[0] == 'P'&&a[len-1] == 'T'){  //判断是否是PA....AT形式 
		int count_A = 0;
		for(int i =1;i<=len-2;i++){
			if(a[i] != 'A')
				return false;          //若出现其他字符直接返回false	
			else
				 count_A++;  
		}
		if(count_A)
			return true;  //全为A,返回true 
		return false;
	}
	else if(a[0] =='A'&& a[len-1]=='A'){
		int count_P,count_T,loca_P,loca_T;                             //loca_P,loca_T记录P T 的位置 
		count_P = count_T = 0 ;                                        //记录P  T字符个数
		for(int j = 0;j<len;j++){
			if(a[j] == 'P' || a[j] == 'A' || a[j] == 'T' ){            //有其他字符直接返回false
				if(a[j] == 'P'){
					count_P++;
					loca_P = j;               //定位P的位置 
				}
				else if(a[j] == 'T'){
					count_T++;
					loca_T = j;              //定位T的位置 
				}
			} 
			else{
				return false;
			}
		} 
		if(count_P ==1 &&count_T == 1){      //P T个数都是1时才往下运行  否则直接false 
			if((len-1-loca_T)/loca_P == loca_T-loca_P-1)
				return true;
			return false;
		}
		return false;
	}
	return false;
}
void res(char *a,int len)
{
	if(isPAT(a, len))
		cout<<"YES";  //因为题目要输出YES NO,所以更改下输出格式
	else
	    cout<<"NO";
}
int main()
{
	
	int n;
	cin>>n;
	char array[n][maxsize];
	for(int i=0;i<n;i++)
	{
		cin>>array[i];
	}
	res(array[0],strlen(array[0]));  //输出格式需要 第一个之前不需要换行
	for(int i=1;i<n;i++)
	{
		cout<<endl;
		res(array[i],strlen(array[i]));
	}
	
	return 0;
} //本人水平有限,代码有点长,可以参考下其他大牛的解法

猜你喜欢

转载自blog.csdn.net/qq_42673507/article/details/83869510