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;
} //本人水平有限,代码有点长,可以参考下其他大牛的解法