您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页PTA乙级题目复习1003

PTA乙级题目复习1003

来源:化拓教育网

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的库函数
 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务