PAT乙级B1003 -我要通过!(20)


答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO

思路:
1.根据第二条xPATx,其中x是任意数目的A,可知:
    PAT......正确
    APATA......正确
    AAAPATAAA......正确
    ......
2.根据第三条,如果 aPbTc 是正确的,那么 aPbATca 也是正确的,可知:
    PAT正确,则......PAAT正确......PAAAT正确, 
    APATA正确,则......APAATAA正确......APAAATAAA正确,
    AAAPATAAA正确,则AAAPAATAAAAAA正确。

    可以这样判定,设置三个变量left,mid,right分别记录P左边,PT之间和T右边A的个数。然后在可递减的情况下,
令right减去left的长度,mid长度减1.直到长度值right<=left或者mid<1为止,若此时满足条件2,则判定正确。
(注意left和right为空的情况下,PAAT是正确的.)

3.分别给P,A,T和其他字母各设置一个计数器,遍历字符串统计个数,若有其他字母出现或字母A个数为零,则输出NO。

4.字符串的处理使用string.substr()以及string.find()进行截取,定位。
    参考学习:点击打开链接

参考代码:
#include
#include
#include
using namespace std;
int main()
{
	int n;
	string s;
	scanf("%d",&n);
	for(int i=0;i>s;
		int flagP=0,flagA=0,flagT=0,other=0;
		 for(int j=0;jleft.size()&&mid.size()>=1){
		 	right=right.substr(0,right.size()-left.size());
		 	mid=mid.substr(0,mid.size()-1);
		 }
		 if(left==right&&mid.size()==1) printf("YES\n");
		 else if(left.size()==0&&right.size()==0&&mid.size()>0)printf("YES\n");
		 else printf("NO\n");
	}
	return 0;
}


优化:
1.使用map容器来统计‘P,'A','T'及其他字母的个数。
2.正确的答案必定是满足只有一个P,一个T,至少一个A,另外左边A个数*中间A个数=右边A个数。(因为右边A个数逐次减去左边A个数最终要使左边等于右边,才符合题意,与此同时中间A每次递减一,最终要留一个)

参考代码:

#include
#include
#include
#include
using namespace std;
int main()
{
	int n,p=0,t=0;;
	string s;
	scanf("%d",&n);
	for(int i=0;i>s;
		map mp;
		 for(int j=0;j0&&mp.size()==3&&p*(t-p-1)==s.size()-t-1)
		 	printf("YES\n");
		 else printf("NO\n");
	}
	return 0;
}

 

你可能感兴趣的:(PAT乙级,字符串处理)