思路点拨:
这道题的关键之处在于对第三个条件的解读
条件三:如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
解读:a,b,c分别为A的个数。只要满足规律:ab=c,则条件三就成立。
会发现第二个条件是第三个条件的特殊情况。
所以,需要满足的三个条件简言之:
字符串正确,则必须含有三个字符P、A、T;
满足ab=c。
转换问题为:分别求输入的字符串中的P、A、T三个字符之间A的个数,对个数进行判断。
代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
string str[10];
for (int i = 0; i<n; i++)
{
cin >> s;
str[i] = s;
}
int a[10], b[10], c[10];
int d, e;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < str[i].size(); j++)
{
if (str[i].at(j) == 'P' || str[i].at(j) == 'A' || str[i].at(j) == 'T')
{
if (str[i].at(j) == 'P') d = j+1;
else if (str[i].at(j) == 'A');
else if (str[i].at(j) == 'T') e = j+1;
}
else
{
str[i] = "NO";
break;
}
}
if (str[i] != "NO")
{
a[i] = d - 1;
b[i] = e - d-1;
c[i] = str[i].size() - e;
}
}
for (int i = 0; i<n; i++)
{
if (str[i] != "NO") {
if (a[i] * b[i] == c[i] && b[i] != 0) str[i] = "YES";// b[i] != 0为了排除PT
else str[i] = "NO";
}
}
for (int i = 0; i<n; i++)
cout << str[i] << endl;
system("pause");
return 0;
}
反思总结:
这道题,考察的知识十分基础,而且不涉及任何算法,主要是考察字符串的基本用法。这道题的巧妙之处在于,如何能把题目进行转化。同时,如何能够巧妙地统计a,b,c分别代表的A的个数。
这道题代码实现完全是自己的想法,希望有所帮助。