#include<stdio.h>
#include<string.h>
int main(void)
{
//1.将字符串输入进数组
char c[10][101];
int i;
int cnt;
scanf_s("%d", &i);
for (cnt = 0; cnt < i; cnt++)
{
scanf_s("%s", c[cnt], 101);
}
/*for (cnt = 0; cnt < i; cnt++)
{
printf("%s\n", c[cnt]);
}*/
//2.计算PT数量
for (cnt = 0; cnt < i; cnt++)
{
int length = strlen(c[cnt]);
int cntx = 0;
int cnty = 0;
int cntz = 0;
int p = 0, t = 0;
int jixu = 1; //用来串联每个环节
int p1 = 0, t1 = 0; //用来记录第一个PT的位置从而进入3环节
for (int cnt1 = 0; cnt1 < length; cnt1++)
{
if (c[cnt][cnt1] == 'P')
{
p++;
p1 = cnt1;
}
if (c[cnt][cnt1] == 'T')
{
t++;
t1 = cnt1;
}
}
if (p == 1 && t == 1)
{
jixu = 1;
}
else
jixu = 0;
//printf("%d\n", jixu);
//printf("p1 = %d t1 = %d", p1, t1);
//3.P要在T之前
if (jixu == 1)
{
if (p1 < t1)
{
jixu = 1;
}
else
jixu = 0;
}
//printf("%d\n",jixu);
//4.PT中间必须有A
if (jixu == 1)
{
jixu = 0;
int j = p1;
for (; j < t1; j++)
{
if (c[cnt][j] == 'A')
{
jixu = 1;
break;
}
}
}
//printf("%d\n", jixu);
//5.检查左右两侧是否都是A
if (jixu == 1)
{
for (int x = 0; x < p1; x++)
{
if (c[cnt][x] != 'A')
{
jixu = 0;
break;
}
}
for (int y = p1 + 1; y < t1; y++)
{
if (c[cnt][y] != 'A')
{
jixu = 0;
break;
}
}
for(int z = t1 + 1;z < length - 1;z++)
{
if (c[cnt][z] != 'A')
{
jixu = 0;
break;
}
}
}
//6.计算
if (jixu == 1)
{
cntx = p1 - 0;
cnty = t1 - p1 - 1;
cntz = strlen(c[cnt]) - 1 - t1;
if (cntx * cnty == cntz)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
if (jixu == 0)
{
printf("NO\n");
}
}
return 0;
}
思路:
1.首先把字符串输入进一个字符串数组
字符串数组一般用char类型的二维数组
第一个【】表示数组中的字符串数量 第二个【】表示每个字符串的最大长度(要把\0算上)
运用for循环进行遍历 把输入的每个字符串都弄进scanf进数组——记得scanf字符串时要加上字符串大小,不然会报错 eg.scanf_s("%s",c[cnt],101)和scanf_s("%s",c,101)
2.计算每个字符串的PT数量
将每个字符串进行遍历 探索出来可以用c[cnt][cnt1] ——cnt是字符串在数组中的位置 cnt1是字符串中每个字符的位置
这样即可遍历字符串中的每个字符从而实现计数
3.确保P要在T前面
在2步骤中即锁定PT第一次出现的位置 然后即可比较坐标大小
4.确保PT之间要有A
两面包夹之势 锁定PT坐标从而确定A
5.PT两边和中间都是A
同4步骤
6.计算P前的A * PT之间的A == T之后的A
有了前面的铺垫就已经确保了PT两边和中间全都是A
因而在这一步可以直接利用坐标来计算A的数量