1.需要注意一下 A的个数,满足P左边A的个数设为 x1 ,P T之间A的个数设为x2,T右边的A个数设为x3,其 满足 x1 * x2 = x3,且P T之间必须要存在至少一个 A。
#include <iostream>
#include <cstring>
//P T 只能有一个,且其余只能为 A,除此之外,顺序为 P A T
//找出错误的即可A PAT A
using namespace std;
string judge(string x)
{
int count_p=0;
int count_t=0;
//first detect
for(int i=0;i<x.length();i++)
{
if(x[i]=='P')
{
count_p++;
}
if(count_p>1)
{
return "NO";
}
if(x[i]=='T')
{
count_t++;
}
if(count_t>1)
{
return "NO";
}
}
//second detect
for(int i=0;i<x.length();i++)
{
if(x[i]!='P' && x[i]!='A' && x[i]!='T')
{
return "NO";
}
}
//third detect
int link = 0;
for(int i=0;i<x.length();i++)
{
if(x[i]=='P')
{
link++; //+1
}
if(x[i]=='T')
{
link++; //+1
}
}
if(link!=2)
{
return "NO";
}
//forth detect
int detect_a = 0;
for(int i=0;i<x.length();i++)
{
if(x[i]=='A')
{
detect_a++;
}
}
if(detect_a<1)
{
return "NO";
}
//fifth detect ,若 T 在 P前面则出错
int sort_p=0;
int sort_t=0;
for(int i=0;i<x.length();i++)
{
if(x[i]=='P')
{
sort_p = i; // 4
}
if(x[i]=='T')
{
sort_t = i; //1
}
}
if(sort_p > sort_t)
{
return "NO";
}
//sixth detect P XX T 检查P xx T 之间是否存在 A
//P,T,A的位置,所有A的位置 统计 三个位置的 A 的个数
int p = 0;
int t = 0;
int a[100];
for(int i=0;i<100;i++)
a[i]=0;
int cc=0;
for(int i=0;i<x.length();i++)
{
if(x[i]=='P') p=i;
if(x[i]=='T') t=i;
if(x[i]=='A')
{
a[cc]=i; cc++;
}
}
int a_large_p=0; //p t 之间 p xx t
int a_small_p=0; //p的左边 xxx p
int a_large_t=0; // t的右边 t xxx
for(int i=0;i<cc;i++)
{
if(a[i]>p && a[i]<t)
{
a_large_p++;
}
if(a[i]<p)
{
a_small_p++;
}
if(a[i]>t)
{
a_large_t++;
}
}
if(a_large_p<1)
{
return "NO";
}
if(a_large_p*a_small_p==a_large_t)
{
return "YES";
}
else{
return "NO";
}
}
int main()
{
string str[100];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>str[i];
}
for(int i=0;i<n;i++)
{
string res = judge(str[i]);
cout<<res<<endl;
}
}