PAT 乙级 1003 我要通过
第一次写博客,不足之处还请各位多多谅解
原题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192
原题条件得知
(1)字符串中必须只能由P、A、T的3个字母组成的字符串且P、T个数只能有一个。
(2)第二个条件xPATx告诉我们形如PAT、APATA、AAPATAA、AAAPATAAA等是正确的。
(3)第3个条件例如形式语言中的文法,我们进行替换推导有
An PAT An => An PAAT AnAn => An PAAAT AnAnAn => An PAkT An*k
我们得到左边的A*中间的A=右边的A。
此外还应注意字符串中P、A、T依次出现且P、T之间必有A。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#define ll long long
using namespace std;
int main() {
int n;
scanf("%d", &n);
string str;
for (int i = 0; i < n; i++) {
int left = 0;
int mid = 0;
int right = 0;
int p_cnt = 0;
int t_cnt = 0;
cin >> str;
bool flg = 1;
for (int i = 0; i < (int)str.size(); i++) {
if (str[i] != 'P'&&str[i] != 'A'&&str[i] != 'T') { //含有其他字符
flg = 0;
break;
}
if (str[i] == 'A'&&p_cnt == 0 && t_cnt == 0) { //P前A
left++;
}
if (str[i] == 'P')p_cnt++; //P个数
if (str[i] == 'A'&&p_cnt == 1 && t_cnt == 0) { //中间A
mid++;
}
if (str[i] == 'T'&&mid > 0) { //T个数
t_cnt++;
}
if (str[i] == 'A'&&p_cnt == 1 && t_cnt == 1) {
right++; //左边A
}
}
if (p_cnt == 1 && t_cnt == 1 && left*mid == right&&flg==1) {
printf("YES\n");
}
else printf("NO\n");
}
}