1. 程式人生 > >PAT 1040 有幾個PAT python (無超時)

PAT 1040 有幾個PAT python (無超時)

1040 有幾個PAT(25)(25 分)

字串APPAPT中包含了兩個單詞“PAT”,其中第一個PAT是第2位(P),第4位(A),第6位(T);第二個PAT是第3位(P),第4位(A),第6位(T)。

現給定字串,問一共可以形成多少個PAT?

輸入格式:

輸入只有一行,包含一個字串,長度不超過10^5^,只包含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 = 0
count_PA = 0
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)