现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO。
输入样例:
9
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
APT
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
NO
思路:
就是通过判断字符串中各字母的数量,位置,和顺序来判断是否正确,可以从题意中得出如下规律:
①若存在P,A,T之外的元素,则判错
②若不存在P,A,T之中的任何一个元素,则判错
③若P,T数量超过1,则判错
④若P,T位置不对,则判错
但是题目所给的第三个样例始终看不出有什么规律,参考了
https://blog.csdn.net/qq_40883132/article/details/80775864这位大佬才知道规律:
第三种情况大概是这种布局------P-------T-------,假设P左边A的数量为n1,PT之间A的数量为n2,T右边A的数量为n3,则有n3=n1n2,对于中间的是空格的情况可以不用考虑
则有条件⑤n3=n1n2
解题代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool judge(string s)
{
int i;
int num_p=0,num_a=0,num_t=0;
int locate_p=0,locate_a=0,locate_t=0;
int num1=0,num2=0,num3=0;
for (i = 0; i < s.length(); i++)
{
if (s[i] != 'P'&&s[i] != 'A'&&s[i] != 'T') //如果某个字符不是P A T三个字符中的一个,直接判断为错误
return false;
if (s[i] == 'P') //计算这三个字符的个数
num_p++;
else if (s[i] == 'A')
num_a++;
else if (s[i] == 'T')
num_t++;
}
if (num_p != 1 || num_t != 1 || num_a < 1) //如果P,T的数量不为1,A的数量为0,判断为错误
return false;
locate_p=s.find('P'); //获取P,A,T的位置
locate_a=s.find('A');
locate_t=s.find('T');
if(locate_p>locate_t) //如果P在T的后面,判错
return false;
for(i=0;i<s.length();i++){ 分别获取p左边,PT之间,T右边A的个数
if(i<locate_p&&s[i]=='A')
num1++;
else if(i>locate_p&&i<locate_t&&s[i]=='A')
num2++;
else if(i>locate_t&&s[i]=='A')
num3++;
}
if(num3==num1*num2)
return true;
else
return false;
}
int main()
{
int n;
string s;
cin>>n;
for(int i=0;i<n;i++){
cin>>s;
if(judge(s))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}