1003
第一句话意为:只含P,A,T三种字符
第二句话意为:PAT前后的字符串要相等,并且都是A字符串或者都是空
第三句话意为:若字符正确,即仅含P,T,A,且PT中间加一个A,那么在尾部加上 P前面所有的字符,所以AAPAATAAAA是正确的,所以可知b一定为A。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
int n = 0;//输入数据的个数
cin >> n;
getchar();//防止误读
string *p = new string[n];//创建字符串数组到堆区 方便仅在程序运行时指定内存大小
for (int i = 0; i < n; i++){//连续读取缓冲区中的字符串,一次读取一行
getline(cin, p[i]);
}
for (int j = 0; j < n; j++){
if (p[j].find("P") != -1 && p[j].find("A") != -1 && p[j].find("T") != -1){//判断是否同时含有PTA,用到了find函数
int ee = 0;//判断是否满足条件的标志
for (int k = 0; k < p[j].size(); k++){//判断是否含PTA之外的字符
if (p[j][k] == 'P' || p[j][k] == 'A' || p[j][k] == 'T'){
ee++;//标志每次都加上1
continue;//如果满足条件就继续执行for循环
}
else{
cout << "NO" << endl;
break;
}
}
if (ee == p[j].size()){//如果满足上个条件,则ee等于字符串的长度
string copy = p[j];//获取中间和左边子串,此操作对原子串做了修改,所以先要拷贝一份
//首先P和T之间全是A 先得到PT之间的子串str
string c = p[j].erase(p[j].find("T"));//先擦除T和T以后的字符串,得到字符串c
string str = c.substr(c.find("P") + 1);//再得到新字符串P以后的字符串
int len = str.size();//获取str的长度,即有几个A
if (len != 0){
string a = p[j].substr(0, p[j].find("P"));//a是P之前的子串
string e = copy.erase(0, copy.find("T"));
string b = e.substr(e.find("T") + 1);//b是T之后的子串
if (b.size() == a.size()*str.size()){//判断是否满足条件:中间A的数目个P左边字符等于T右边字符
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
}
else{
cout << "NO" <<endl;
}
}
}
else{
cout << "NO" << endl;
}
}
delete[]p;
p = NULL;
return 0;
}
注意此题的难度不大,主要涉及到了字符串的函数操作,因此要熟记几个string的库函数