我做了个pta乙级题解的专栏,欢迎来专栏看哦~
分析在代码中的注释里,尤其是对题中“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”这句话的分析。(这句话是我起初无法理解的。)
C++
#include <iostream>
#include <string>
#include <array>
using namespace std;
array<string, 10> testStr = {};
bool isTrue(string x)
{
unsigned countPreX = 0; // 对于条件2 前面的字符串x长度
unsigned countLatX = 0; // 对于条件2 后面的字符串x长度
unsigned count1 = 0; // 对于条件3 P之前的A字符串长度
unsigned count2 = 0; // 对于条件3 P T之间A的长度
unsigned count3 = 0; // 对于条件3 T之后的A的长度
size_t i, flag;
int p_ = x.find("P");//P所在位置
int t_ = x.find("T");//T所在位置
if ((-1 == p_) || (-1 == t_) // P或T不存在
|| (p_ > t_)) // P T位置不对
{
return false;
}
// 检测条件1
for (size_t j = 0; j < x.size(); j++)
{
if (x[j] != 'P' && x[j] != 'A' && x[j] != 'T')
{
return false;
}
}
// 检测条件2 & 检测条件3 一同检测
/* 检测条件3 : 条件3中所说的“如果aPbTc正确” 是对于条件2来说的,【之前总是无法理解这句话来着“如果 aPbTc 是正确的,那么 aPbATca 也是正确的”】
也就是说,条件2中正确的“PAT”,通过条件3-->可以得出正确的还有:PAAT/PAAAT.....
APATA --> APAATAA/APAAATAAA/APAAAATAAAA.....
AAPATAA --> AAPAATAAAA/AAPAAATAAAAAA......
.
.
.
最终结论:P之前的A的个数count1 P、T之间的A个数count2 T之后的A个数count3关系如下:
count3 = count2 * count1【终于得到这个结论了,距离第一次做这一题,已经过去几个月了。。】
但要注意用例:PT(不通过)
*/
// 计算count1
for (i = 0; i < x.size(); i++) // 计算PAT前面的字符长度
{
if (x[i] != 'P')
{
if (x[i] != 'A')
{
return false;
}
count1++;
}
else
{
break;
}
}
// 计算count2
for (i = i + 1; i < x.size(); i++)
{
if (x[i] != 'T')
{
if (x[i] != 'A')
{
return false;
}
count2++;
}
else
{
break;
}
}
// 计算count3
for (i = i + 1; i < x.size(); i++)
{
if (x[i] != 'A')
{
return false;
}
count3++;
}
if (count1 * count2 == count3 && count2 != 0)
{
return true;
}
else
{
return false;
}
}
int main()
{
unsigned n;
cin >> n;
for (size_t i = 0; i < n; i++)
{
cin >> testStr[i];
}
for (size_t i = 0; i < n; i++)
{
if (i)
{
cout << "\n";
}
if (isTrue(testStr[i]))
{
cout << "YES";
}
else
{
cout << "NO";
}
}
return 0;
}