PAT乙级1003-Python

1003 我要通过! (20 分)

注意:代码满分通过

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”
得到“答案正确”的条件是:
1.字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 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,我还自己学习了正则表达式相关的知识。正则表达式学习

你可能感兴趣的:(PAT乙级1003-Python)