题目要求
1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
利用str函数
根据条件推断:
条件1:
- 可设置一个set然后遍历判断是否存在其他字符
- 或 利用count函数得出字符串中’P’,‘A’,'T’三个字符的数量之和并与字符串总长相比较
条件2&3:
- P和T都有且仅有一个且P在T之前,A至少存在一个;
- 用a1、a2、a3分别代表a、b、c中A的数量
- 任意aPbATca形都是由aPbTc形得来的,而最基本的aPbTc形为xPATx(即PAT,APATA,AAPATAA…)所以应该有:
- a1*a2==a3
def f(s):
length=len(s)
a1,a2,a3=0,0,0
PN,TN,AN=s.count('P'),s.count('T'),s.count('A')
if PN!=1 or TN!=1 or AN<1 or PN + TN + AN < length:
return False
P=s.find('P')
T=s.find('T')
a1=P
a2=T-P-1
a3=length-T-1
if not a1 * a2 == a3:
return False
return True
n=int(input())
for i in range(n):
s=input()
if f(s):
print('YES')
else:
print('NO')
利用正则表达式
形如xPATx、 aPbTc、aPbATca一类的,以正则表达式的形式表示是:^(A*)P(A+)T(A*)
接下来利用re中的分组功能分组后判断每组字符串长度即可
import re
def f(s):
a=re.match(r'^(A*)P(A+)T(A*)$',s) #匹配成功返回一个Match对象,失败返回None
if a:
if len(a.group(1))*len(a.group(2))==len(a.group(3)):
return True
else:
return False
else:
return False
n=int(input())
for i in range(n):
s=input()
if f(s):
print ('YES')
else:
print ('NO')