1003 我要通过! (20 分)
注意:代码满分通过
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1.字符串中必须仅有 P
、 A
、T
这三种字符,不可以包含其它字符;
2.任意形如 xPATx
的字符串都可以获得“答案正确”,其中 x
或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc
是正确的,那么 aPbATca
也是正确的,其中 a
、 b
、 c
均或者是空字符串,或者是仅由字母 A
组成的字符串。
输入格式:
每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。
输出格式:
每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES
,否则输出 NO
。
输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO
思路:
1.P必须在T的前面
2.P和T之间必须有字符,且一定包含A
3.P与T之间的字符串长度影响P和T两侧的字符串长度。
代码:
def isValid(s):
x = -1
y = -1
for i in range(len(s)): # 找到P和T的最靠后面的位置
if s[i] == 'P':
x = i
if s[i] == 'T':
y = i
if x == -1 or y == -1: # 如果找不到P或者T则返回False
return False
else:
if x > y: # P在T的后面,返回False
return False
else: # P在T前面
if y == x + 1: # P,T之间没有字符,返回False
return False
else: # P,T之间有字符
if x != 0: # 字符串不以P开头
b = s[0:x]
else: # 字符串以P开头
b = []
c = s[(x + 1):y]
if y != len(s) - 1: # 字符串不以T结尾
d = s[(y + 1):len(s)]
else: # 字符串以T结尾
d = []
# 判断各个分段是否是字符A组成
for i in b:
if i != 'A':
return False
for i in c:
if i != 'A':
return False
for i in d:
if i != 'A':
return False
# 条件判断
if d == b * len(c):
return True
else:
return False
def main():
n = int(input())
line = ''
while n:
line = input()
if isValid(line):
print("YES")
else:
print("NO")
n -= 1
if __name__ == "__main__":
main()
运行结果:
运行截图
总结
觉得这道题非常复杂,总是漏情况,仔细审题,并寻找规律,计算机学科是一个需要寻找规律的学科。
正则表达式
import re
n = int(input())
for i in range(n):
line = input()
if re.match(r'A*PA+TA*', line): # 在字符串中进行匹配
a = re.split(r'[P|T]', line) # 以字符P,T进行分段
if a[0] * len(a[1]) == a[2]: # 条件判断
print('YES')
else:
print('NO')
else:
print('NO')
以上代码为参考别人所写,并非CV,我还自己学习了正则表达式相关的知识。正则表达式学习