解法:记P之前A的数量为ans1,T之后A的数量为ans2,PT之间A的数量为ans3
由任意形如 xPATx
的字符串都可以获得“答案正确”可知P之前的A数量和T之后的数量至少相等;又由如果 aPbTc
是正确的,那么 aPbATca
也是正确可知(递归),P和T之间有多少个b,T后面就有多少个c,此外最简单的正确项就是aPATa,所以初始的PT两边的a大小一致,所以有ans2==ans3*ans1时为正确项。
#include<iostream>
#include<string>
using namespace std;
bool f(string a) {
int ans1=0,ans2=0,ans3=0;
int flag=0;
for(int i=0; i<a.size(); ++i) {
if(flag==1) {//PT中间A数量
if(a[i]!='A'&&a[i]!='T')
return false;
else if(a[i]=='T') {
if(ans3)
flag+=1;
else return false;
} else ans3++;
} else if(!flag) {//P之前的A数量
if(a[i]=='P')
flag+=1;
else if(a[i]!='A')
return false;
else ans1++;
} else {//T之后的数量
if(a[i]!='A')
return false;
else ans2++;
}
}
if(ans2!=ans1*ans3||a.size()<3)
return false ;
return true;
}
int main () {
int n;
cin>>n;
for(int i=0; i<n; ++i) {
string a;
cin>>a;
if(f(a))
cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}