答案
#include <iostream>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
string s;
cin >> s;
map<char, int> mp;
int l = 0, r = 0;
for (int i = 0; i < s.size(); i++)
{
mp[s[i]]++;
if (s[i] == 'P') l = i;
if (s[i] == 'T') r = i;
}
if (mp['P'] == 1 && mp['T'] == 1 && mp['A'] >= 1 && mp.size() == 3 && (r - l - 1) >= 1 && l * (r - l - 1) == s.size() - 1 - r)
{
cout << "YES" << endl;
}
else cout << "NO" << endl;
}
return 0;
}
tips:
1.只看题目不行,需要结合测试样例总结出规律
PAT必须都有且PT只有一个
mp['P'] == 1 && mp['T'] == 1 && mp['A'] >= 1;
不能有其他字母
mp.size() == 3;
PT之间必有A
(r - l - 1) >= 1;
只看题目规则:如果这样对则那样对,这样去写程序很复杂,要想着简化,通过看测试用例可以猜出A个数的规律
l * (r - l - 1) == s.size() - 1 - r;
2.本题需掌握map用法
map<char,int> mp;//mp['A']++;是这个种类带的个数加加
mp.size()是map的种类