分享给大家一个PTA算法题的代码
1003 我要通过! (20分)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
大家注意,这道题需要先分析,由“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”得出,b=A,在思考观察,运用数学思维,设a为x,分析x,2A,2x之间的关系,不难得出蕴含乘法逻辑,接下来代码就好写了。
添加链接描述
#include<iostream>
#include<string>
using namespace std;
bool Judge(string s)
{
bool Pexist=false,Aexist=false,Texist=false;//定义P,A,T存在标志
for(int i=0;i<s.length();i++)
{//如果存在P,A,T,则标记为真
if(s[i]=='P')
Pexist=true;
else if(s[i]=='A') Aexist=true; else if(s[i]=='T') Texist=true;
else//如果有不为P,A,T的字符则返回假
return false; }
if(Pexist&&Aexist&&Texist)//如果字符串都只由P,A,T组成
{ int posP,posT;//定义第1个P和最后1个T的位置
for(int i=0;i<s.length();i++) if(s[i]=='P') { posP=i; break; }
for(int i=s.length()-1;i>=0;i--) if(s[i]=='T') { posT=i;
break; }//找到第1个P和最后1个T的位置
for(int i=posP+1;i<posT;i++) if(s[i]!='A')//检验两者之间是否只有字符A
return false;//若出现不是A的字符,则返回假
//现在,字符串只由P,A,T构成且只有一个P和一个T,P和T之间只有A
int cntAbfP=posP;//统计P之前A的个数
int cntAbtPT=posT-posP-1;//统计PT之间A的个数
int cntAbhT=s.length()-1-posT;//统计T之后A的个数
if(cntAbfP*cntAbtPT==cntAbhT)
return true;//如果P之前A的个数*PT之间A的个数 =T之后A的个数 则符合要求,返回真
return false; } return false;//如果字符串只由P,A,T中的一个或两个字符组成,返回假
}int main(){ int n; string s; cin>>n;
while(n--)
{ cin>>s; if(Judge(s)) cout<<"YES"<<endl;
else
cout<<"NO"<<endl; }
return 0;}