分析题目
得到“答案正确”的条件是:
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;
}