只看代码直接拖到最下面
其实刚一看这个题没看懂,很轻易就能得出的结论是:
必须要有PAT三个字符,P,T有且只有一个,P在T前面。
第2,3点就不知道具体想表达啥了,反正我是没看出来。看了一下网上的博客,大家普遍认同的一种结论是:
以P和T为边界可以分为三部分: ********** P***********T *********,也就是画星号的三部分。我们先不管空字符串的情况,如果星号都是由字母A组成,以上归纳出来的规律是这样的,如果P之前的A的个数为n1,P到T之间的A个数为n2,T之后的A的个数为n3,那么有n3=n2n1.具体怎么得出来的我也不知道,用这个式子去验证那几种样例是明显符合的。
上代码:
这代码看了这个博主的思路,写出来基本一样了…https://blog.youkuaiyun.com/qq_40883132/article/details/80775864
代码中检验的几点是:
1.包含每个字符必须是PAT中的一个
2.P在T前面
3.P和T个数为1,A至少1个
4.n3=n1*n2
解释一下为什么大家都没有去关注那个空字符串,我开始觉得每个字符必须是PAT,那空格呢,在我的想象中,之前学字符串打印一个hello world 中间的空格也算是一个字符啊。但是在计算长度的时候去写个代码发现,如果两个单词中间有一个空格他的字符串就在空格处直接结束了。如果前后有空格,空格没有算长度的。那这道题我们的空字符可以不管他了。只计算a就行了。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool judge(string s)
{
int i;
int count_p = 0, count_a=0, count_t=0;
int position_p = 0, position_a=0,position_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') //计算这三个字符的个数
count_p++;
else if (s[i] == 'A')
count_a++;
else if (s[i] == 'T')
count_t++;
}
if (count_p != 1 || count_t != 1 || count_a < 1)
return false;
position_p = s.find('P'); //找到这三个字符的位置
position_a = s.find('A');
position_t = s.find('T');
if (position_p >= position_t)
return false;
for (i = 0; i < s.length(); i++)
{
if (i < position_p&&s[i] == 'A')
num1++;
else if (i > position_p&&i<position_t&&s[i] == 'A')
num2++;
else if (i > position_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;
}