PTA1003我要通过!
各位不要白嫖哦,对你有帮助就点个赞呗,积极的反馈很重要滴
- 由条件1可知只能有P、A、T这三种
- 由题中条件2知,形如-PAT-这样的正确,
- 条件3是一个 p->q(若p则q)这样的一个逻辑推理,由条件2可推出 - PAAT- -,然后又可以继续推下去。
- 最终可归纳出 ···P···T··· ,即T后面的A个数,等于P前面的A个数 * PT之间的A个数,只要满足此条件就行。
- 注意当PT之间没有A的时候,是不成立的。
我的思路是找到p、t出现位置的数组下标,利用下标就能解题了
#include<iostream>
using namespace std;
bool judge(string str){
int p_p,p_t; //记录p、t的位置
int sum_p = 0; //记录p、t出现的次数
int sum_t = 0;
for(int i = 0; i < str.length(); i++){
if(str[i] != 'P' && str[i] != 'A' && str[i] != 'T')return false;
if(str[i] == 'P'){sum_p++; p_p = i;}
else if(str[i] == 'T'){sum_t++; p_t = i;}
}
if(sum_p > 1 || sum_t > 1)return false; //防止P和T的第二次出现
if((p_t - p_p - 1) == 0)return false; //PT之间没有A的时候
if((p_t - p_p - 1)*p_p == (str.length() - p_t - 1))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;
}