PAT真题乙级1003我要通过

1003我要通过

个人水平有限,如有不对的地方请指出,谢谢。

题目

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

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

字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

个人理解:

1.仅包含P,A,T三种字符,包含其他字符答案错误
2.条件2,3可以看作一个条件:P前的A的个数与P与T之间A的个数的乘积是T之后A的个数。
3.条件二的解释:xPATx,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;这里PT之间A的个数是1,x中A的个数乘以PT之间A的个数(这里是1)就是x中A的个数。
4.在题目中可以看出P,T的个数只能为1.

综上这个题目的条件总结一下:
1.只能含有P,A,T三种字符且P和T的字符出现次数只有一次。(P一定要在T之前,当然没在的话依然能通过,但是有逃课的感觉??)
2.P前的A的个数与P与T之间A的个数的乘积是T之后A的个数。

思路

1.基本判断采用函数
2.首先判断输入的字符串是否含有其他字符,如果有直接NO。
3.确定P,T的出现次数是否为1,不满足直接NO。
4.统计P之前A的个数,P,T之间A的个数,T之后A的个数,不满足条件三直接NO。
5.以上条件都满足则 YES

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool check(char* s, int len) {       //检查字符串是否只含有P,A,T三种字符
	int p, a, t;   //P,A,T标志
	int pl, tl;  //p和t的位置
	p = a = t = 0;
	for (int i = 0;i < len;i++) {
		if (s[i] != 'P' && s[i] != 'A' && s[i] != 'T')
			return false;
		if (s[i] == 'P') {
			p++;      //P的个数
			pl = i;
		}
		if (s[i] == 'T') {
			t++;      //T的个数
			tl = i;
		}
		if (s[i] == 'A')
			a = 1;
	}
	if (p + t + a == 3 && pl < tl)  //只能含有一个P和T
		return true;
	else
		return false;
}


int main() {
	char s[101];
	int flag = 0;
	scanf("%d", &flag);
	getchar();
	int len = 0;
	for (int i = 0;i < flag;i++) {
		scanf("%s", &s);
		len = strlen(s);
		if (check(s, len)) {
			int p, t;  //P和T的位置
			p = t = 0;
			for (int n = 0;n < len; n++) {   //获得第一个P和第一个T的位置
				if (s[n] == 'P')
					p = n;
				if (s[n] == 'T')
					t = n;
			}
			if (p * (t - p - 1) == (len - t - 1))
				printf("YES\n");
			else
				printf("NO\n");
		}
		else printf("NO\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值