PAT乙级考试-1003 我要通过!

题目
在这里插入图片描述
在这里插入图片描述
思路

  1. 录入数据
    由于给出的字符串数量不多,建立一个二维数组保存原始的字符串,录入字符串时,注意把每行最后的\n替换为\0,方便后续的判断;再建立一个数组保存结果用于打印。

  2. 判断字符串是否符合要求
    前两个条件很好理解,这里不再赘述
    对于第三个条件,我们设串中‘P’前面的‘A’有l个,‘P’和‘T’中间的‘A’有m个,‘T’后方的‘A’有n个,有以下三个结论
    (1)若一个串C的m>1且满足条件,则必然有一个前置串C’也满足条件,C’中l’=l,m’=m-1,n’=n-l;
    (2)根据上一个结论,每一个满足条件且m>1的串C都可以递推出一个初始串C’’,该串有l’’=l,m’’=1,n’’=n-(m-1)*l;
    (3)若初始串满足条件,则C也满足条件,若初始串不满足条件,则C不满足条件

  3. 打印结果
    注意最后一行不要打印换行符即可

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

char* f_gets(char ch[], int n)//录入函数
{
	char* p;
	int i = 0;
	p = fgets(ch, n, stdin);
	if (p)
	{
		for (i = 0; ch[i] != '\n' && ch[i] != '\0'; i++);
		if (ch[i] == '\n')
			ch[i] = '\0';
		else
			while ('\n' != getchar());
	}
	return p;
}

int judge(char ch[])//判断函数,这里用a,b,c代替l,m,n
{
	int a, b, c;
	int i;
	for (i = 0, a = 0; ch[i] == 'A'; i++)
		a++;
	if (ch[i] != 'P')
		return 0;

	for (i = i + 1, b = 0;  ch[i] == 'A'; i++)
		b++;
	if (ch[i] != 'T')
		return 0;

	for (i = i + 1, c = 0;  ch[i] == 'A'; i++)
		c++;
	if (ch[i] != '\0')
		return 0;

	if(b>1)//b>1时递推出其初始串
	{
		c = c - (b - 1) * a;
		b = 1;
	}

	if (b < 1 || c < 0)
		return 0;
	else if (b == 1 && a == c)
		return 1;
	else
		return 0;
}

int main(void)
{
	int n;
	char ch[10][101];
	int res[10];
	int i;
	scanf("%d", &n);
	getchar();
	if (n == 0)
		return 0;
	for (i = 0; i < n; i++)
		f_gets(ch[i], 101);
	for (i = 0; i < n; i++)
		res[i] = judge(ch[i]);
	for (i = 0; i < n - 1; i++)
		if (res[i] == 0)
			printf("NO\n");
		else
			printf("YES\n");
	if (res[i])
		printf("YES");
	else
		printf("NO");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值