题目
思路
-
录入数据
由于给出的字符串数量不多,建立一个二维数组保存原始的字符串,录入字符串时,注意把每行最后的\n替换为\0,方便后续的判断;再建立一个数组保存结果用于打印。 -
判断字符串是否符合要求
前两个条件很好理解,这里不再赘述
对于第三个条件,我们设串中‘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不满足条件 -
打印结果
注意最后一行不要打印换行符即可
#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;
}