Python3 PAT (Basic Level) 【乙级】 - 1003 我要通过

原题链接

解题思路:
相信很多朋友和我一样,在读懂题意上就碰了一鼻子灰。我会尽量细则的讲解题意,题意如下。
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")

这一题,若还有问题,可以与我留言,我尽力解答,也可结合代码注释,进一步理解。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值