1003
第一句话意为:只含P,A,T三种字符
第二句话意为:PAT前后的字符串要相等,并且都是A字符串或者都是空
第三句话意为:若字符正确,即仅含P,T,A,且PT中间加一个A,那么在尾部加上 P前面所有的字符,所以AAPAATAAAA是正确的,所以可知b一定为A。
#include#include #include 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" < 注意此题的难度不大,主要涉及到了字符串的函数操作,因此要熟记几个string的库函数



