得到“答案正确”的条件是:
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串
首先分析要求 (1):也就是字符串中只能有’P’ ‘A’ ‘T’三个字符。(2):要求二就是PAT字符串的左边和右边可以加相同个数的字符’A’,0个也是加,所以PAT APATA AAAPATAAA 这些都是符合要求的。(3):第三点尤要注意!!!!!首先是这个如果。如果 aPbTc 是正确的,也就是说这个aPbTc是符合要求**(1)(2)**的所以b必定是A或者A字符串,而a和c是相同数量的A。Ⅰa=c=空 b=A 所以 PAT是正确的所以 PAAT是正确的 所以PAAAT是正确的,Ⅱa=c=A 所以APATA是正确的,所以APAATAA是正确的,所以APAAATAAA是正确的。从这里可以知道每一次a不变对应下一次的b=b+1,c=a+c 可以得出P T之前A的个数乘P T之间A的个数=P T之后A的个数。
代码如下 要把打印信息关了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int num = 0;
int i = 0,j = 0,flag=0;
char str[10][100];
int string_size = 0;
int A_FRONT = 0,A_MIDDLE = 0,A_BEHIND = 0, P_FLAG = 0,T_FLAG = 0;
scanf("%d",&num); /*字符串数量*/
for(i=0;i<num;i++)
{
scanf("%s",str[i]); /* scanf不能char *所以用字符数组 */
}
/*judgement */
for(i=0;i<num;i++)
{
string_size = strlen(str[i]);
flag = 1;
A_FRONT = 0;
A_MIDDLE = 0;
A_BEHIND = 0;
P_FLAG = 0;
T_FLAG = 0;
for(j = 0;j<string_size;j++)
{
if (str[i][j]!='P' && str[i][j]!='A' && str[i][j]!='T') /*只有PAT三个字符*/
{
printf("检测到非PAT字符\r\n");
strcpy(str[i],"NO");
flag = 0;
break;
}
if(P_FLAG) //已经检测到P了
{
printf("aaaaa=%c\r\n",str[i][j]);
if(T_FLAG) //检测到T了,统计后面的A的个数
{
if(str[i][j]!='A')
{
strcpy(str[i],"NO");
flag = 0;
break;
}
A_BEHIND ++; //统计 PT后面的A的个数
}
else //没有检测到T说明统计PT之间A的个数
{
if(str[i][j] != 'T' && str[i][j] != 'A')
{
strcpy(str[i],"NO");
flag = 0;
break;
}
if(str[i][j] == 'T')
{
printf("检测到T\r\n");
if(A_FRONT+A_MIDDLE +1 != j)
{
strcpy(str[i],"NO");
flag = 0;
break;
}
T_FLAG = 1;
}
else
{
A_MIDDLE ++; //统计 PT后面的A的个数
}
}
}
if(!P_FLAG) /*没检测到P所以只能是 P or A 并且统计PT前面的A的数量*/
{
printf("未检测到P\r\n");
if(str[i][j]!='A' && str[i][j]!='P') //既不是P也不是A
{
strcpy(str[i],"NO");
flag = 0;
break;
}
if(str[i][j] =='P') /*检查到P*/
{
if(A_FRONT != j) //判断p前面的A数量
{
strcpy(str[i],"NO");
flag = 0;
break;
}
P_FLAG = 1;
printf("检测到P\r\n");
}else
{
A_FRONT ++; /*检测到A并且++*/
}
}
}
printf("A_FRONT=%d\r\n",A_FRONT);
printf("A_MIDDLE=%d\r\n",A_MIDDLE);
printf("A_BEHIND=%d\r\n",A_BEHIND);
printf("flag=%d\r\n",flag);
if(flag == 1)
{
if(A_MIDDLE == 0)
{
strcpy(str[i],"NO");
}
else if(A_FRONT*A_MIDDLE==A_BEHIND)
{
strcpy(str[i],"YES");
}
else
{
strcpy(str[i],"NO");
}
}
}
//print
for(i=0;i<num;i++)
{
printf("%s\r\n",str[i]);
}
return 0;
}