PAT 1040 有几个PAT python (无超时)

95 篇文章 1 订阅

1040 有几个PAT(25)(25 分)

字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位( P ),第4位( A ),第6位( T );第二个PAT是第3位( P ),第4位( A ),第6位( T )。

现给定字符串,问一共可以形成多少个PAT?

输入格式:

输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。

输出格式:

在一行中输出给定字符串中包含多少个PAT。由于结果可能比较大,只输出对1000000007取余数的结果。

输入样例:

APPAPT

输出样例:

2

作者: CAO, Peng
单位: PAT联盟
时间限制: 120ms
内存限制: 64MB
代码长度限制: 16KB

问题分析:
这题打眼一看,说是要 “对1000000007取余数”,这计算量肯定不小
(可达鸭眉头一皱,发现事情并不简单)

常规思路
代码:

n = input()
count = 0
for i in range(len(n)):
    if n[i] == 'P':
        for j in range(i + 1, len(n)):
            if n[j] == 'A':
                for x in range(j + 1, len(n)):
                    if n[x] == 'T':
                        count += 1
print(count % 1000000007)

果然后三个节点超时,然而以博主的智商,实在不知道怎么怎么优化算法
有幸翻到大佬的微博:
https://blog.csdn.net/ice_camel/article/details/44263451
但是有一点不是很明白,不知道为什么大佬要从后往前读字符串,这点稍微有所修改,也可通过

改进代码:

n = input()
count_P = count_PA = count_PAT = 0
for i in n:
    if 'P' == i:
        count_P += 1
    elif 'A' == i:
        count_PA += count_P
    else:
        count_PAT += count_PA
print(count_PAT % 1000000007)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值