1003 我要通过(PAT 乙级 )C语言

分析题目

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

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


条件3刚开始给我整晕了,后来我通过题目给的测试用例分析:
假设 s = AAPAATAA,如何判断它是否正确呢?
我们对比条件三,采用倒推的方式,令s = aPbATca形式,(a=‘AA’,b=‘A’,c=’ ‘), 那么推回去就是 s’ = AAPAT,此时判断s’是不是正确的呢?根据条件2来判断s‘是错误的,于是s也是错误的。

代码流程:
首先找出P和T的位置,记为index_P 和 index_T; 此外其他的位置只能存放’A’; 这是满足条件一的必然要求,否则打印‘NO’;

用left , mid , right 分别计算左边,中间,右的’A‘的数量。
(A A P A A T A A)

如果mid>=2,则采用倒退形式,每一次都让mid- - && right = right - left; 直到 mid ==1返回;

这时候用条件2来判断, 即若left == right 则 通过 打印’yes‘ 否则 ’NO‘

代码如下

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

#define max 10 

int find_P(char res[]){
	int i;
	for(i=0; res[i]!='\0';i++)
		if(res[i]=='P')
			return i;
		else if(res[i]!='A')
			return -1;
	return -1;
}

int find_T(char res[],int i){
	for(;i>0 && res[i]!='\0';i++)
		if(res[i]=='T')
			return i;
		else if(res[i]!='A')
			return -1;
	return -1;
}

int main(){
	int N,mid,left,right,index_P,index_T,i;
	char res[101];
	scanf("%d",&N);
	int mask[10]={0};
	for(i=0; i<N; i++){
		scanf("%s",res);
		index_P = find_P(res);	
		index_T = find_T(res,index_P+1);
		//printf("%d %d",index_P,index_T);
		if(index_P == -1 || index_T == -1 || index_T-index_P<=1){
			mask[i]= -1;
			continue;
		}
		left = index_P;
		right = strlen(res)-index_T-1; 
		mid = index_T - index_P-1;
		//printf("%d,%d,%d\n",left,mid,right);
		while(mid >=2){
			mid--;
			right = right - left;
			
		}
		//printf("%d,%d,%d",left,mid,right);
		if(left == right)
			mask[i] = 1;
		else
			mask[i] = -1;
	}
	
	for(i=0; i<N; i++){
		if(mask[i]==1)
			printf("%s\n","YES");
		else
			printf("%s\n","NO");
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值