解题思路:
相信很多朋友和我一样,在读懂题意上就碰了一鼻子灰。我会尽量细则的讲解题意,题意如下。
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;(这个很好理解,不多赘述)
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
(这则内容实际非常关键,它透露了两个信息,"PAT"是通过的,“aPATb” 中左右两边的字符串a与字符串b中 “A” 字符的数量相等时,是通过的)
3.如果 aPbTc 是通过的,那么 aPbATca 也是通过的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
第三条最为重要,接下来分析第三条我们能得到的信息:
(1)我们看到:输出用例中"PT"字符串不能通过,因为违反了第一条。所以在形如aPbTc中,a,b,c并不能是空字符串。而我们根据第二条知道,当a,b,c不能为空且b=‘A’,时a必等于c。另外结合输出样例可以知道有PAAT,是通过的,根据a Pb Tc ->a P bA Tca 得,PAAT -> PAAA…AT通过。
(2)若aPbTc是正确,那么允许aPbATca正确。我们知道最基础的 aPbTc,实际就是aPATc即xPATx,此时a必等于c且b=‘A’,所以如果a P bA T ca成立,必然有c=n*a,且bA 字符串中’A’的个数= ca/a
bA 字符串中’A’的个数= ca/a
这里强调一下,aPbTc->aPbATca,实际可以理解成aPATa->aPAATaa,再往下可推出
aPAATaa->aPAAATaaa 所以我们可以得出aPbATc中的bA字符串’A’的个数=ca/a。
我们把所得规则再整理一下,即:
1.再形如xPyTz的字符串中,必须有且仅有P、A、T组成。
2.PAAA…AT成立
3.xPATx,成立,x为空或者为A组成的字符串
4.y=z/x时,成立 且x、y、z都为A组成的字符串
def tellPAT(setence):
if sentence.count('P') == 1 and sentence.count('T') == 1 and sentence.find('P') < sentence.find('T'):
# 确定 P、T在字符串中只有一个 且 P在T的左边
cut_p = sentence.split('P')
# 形如 xPyTz ,划分为 x 、 yTz
str_x = cut_p[0]
cut_t = cut_p[1].split('T')
# yTz 划分为 y 、 z
str_y = cut_t[0]
str_z = cut_t[1]
state = 0 #判断状态值
# 确定x、y、z中只有A字符
for i in str_z + str_y + str_x:
if (i != 'A'):
state = 1
break
if state ==1: #x、y、z中存在其它符号时
return False
if len(str_x) == len(str_z) and len(str_y) >= 1: #对应PAT、PAA...T、xPATx
return True
elif len(str_x) != 0 and len(str_y) == len(str_z) / len(str_x): #对应aPbATac
return True
else:
return False
else:
return False
n=int(input())
for i in range(n):
sentence=str(input())
if tellPAT(sentence):
print("YES")
else:
print("NO")
这一题,若还有问题,可以与我留言,我尽力解答,也可结合代码注释,进一步理解。