题目如下![](https://img-blog.csdn.net/20180228154944601?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21hbGxpMDA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
分析:
要能得到答案正确字符串必须:
1,至少3个字符且全由P,A,T组成,所以少于三个字符或者有其他字符的可以直接false。
bool noelse(string str)
{
int i,m=str.length();
for(i=0;i<m;i++)
{
if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')
return false;
}
return true;
}
2,XPATX则,PAT的前后必须一样。P的前和T的后必须都是A组成的字符串或者空。
3,如果aPbTc正确,那么aPbATca正确。则b一定不可能是空,如果b是‘A'则c==a,那么aPbATca==aPAATaa是正确的。如果b是‘AA'则c==aa。那么aPbATca==aPAAATaaa是正确的。
所以我们可以得到PT之间有b个A,b>0,且可以得到aPbTc正确时,c=a*b;
前台数据有:
还有些后台数据是前台没有的例子如:“P”“A”“T”“AP”“PA”“APT”“PATT”“PAAA”“AAPA”等等
/*
这题要注意三种前台没有的数据类型
1.P,A,T,PA
2.PATT
3.PAAA,AAAP,APAA
*/
#include<iostream>
#include<string>
using namespace std;
bool isallA(string a,int b,int e)
{
int i;
for(i=b;i<e;i++)
{
if(a[i]!='A')
return false;
}
return true;
}
bool noelse(string str)
{
int i,m=str.length();
for(i=0;i<m;i++)
{
if(str[i]!='P'&&str[i]!='A'&&str[i]!='T')
return false;
}
return true;
}
int main()
{
int n,m,i,j,k;
string str;
bool flag;
while(cin>>n)
{
while(n!=0)
{
cin>>str;
m=str.length();
j=0;
flag=true;
//如果P,A,T等等低于3位的均直接false;
if(noelse(str)==true&&m>=3)
{
for(i=0;i<m;i++)
{
if(str[i]=='P')
{
//出现P,开始计算A的个数。break出不是A的位置,也可能是到结束了
for(j=i+1;j<m;j++)
{
if(str[j]!='A')//不为A,则可能是P或者是T.
break;
}
}
//如果j是结束了,没有遇到P,或者break出来是下个P的位置或者PT中间没有A。
if((j!=0&&str[j]=='p'&&j-i==1)||j==m)
{
flag=false;
break;
}
//如果break出来的是T的位置。且已经出现过P。不可能是j=0
if(j!=0&&str[j]=='T')
{
//P的前和T的后必须都是A组成的字符串或者空。
if(isallA(str,0,i-1)==true&&isallA(str,j+1,m)==true)
{
int q,p;//q表示P前面的个数乘以PT之间A的个数,q表示T后面的个数
//i是P出现的位置,j是T的位置,m是字符串长度
q=i*(j-i-1)+1;//因为可能是0,所以要加1.
p=m-j;
if(p==q&&j!=i+1)
flag=true;
else
flag=false;
// cout<<"J:"<<j<<" I:"<<i<<" M:"<<m<<endl;
// cout<<p<<"AND"<<q<<endl;
break;
}
else
{
flag=false;
break;
}
}
}
}
else
flag=false;
if(flag==false)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
n--;
}
}
return 0;
}