1. 程式人生 > >牛客網線上程式設計(19):暗黑字串-python

牛客網線上程式設計(19):暗黑字串-python

題目描述

一個只包含'A'、'B'和'C'的字串,如果存在某一段長度為3的連續子串中恰好'A'、'B'和'C'各有一個,那麼這個字串就是純淨的,否則這個字串就是暗黑的。例如:
BAACAACCBAAA 連續子串"CBA"中包含了'A','B','C'各一個,所以是純淨的字串
AABBCCAABB 不存在一個長度為3的連續子串包含'A','B','C',所以是暗黑的字串
你的任務就是計算出長度為n的字串(只包含'A'、'B'和'C'),有多少個是暗黑的字串。

輸入描述:

輸入一個整數n,表示字串長度(1 ≤ n ≤ 30)

輸出描述:

輸出一個整數表示有多少個暗黑字串

示例1

輸入

2
3

輸出

9
21

程式碼實現

n=int(input())
mem=[3,9]
for i in range(n-2):
    mem=[mem[1],2*mem[1]+mem[0]]
print(str(mem[1]))

 原理說明

1.初始化一個數組mem,mem裡初始儲存的是n=1和n=2時的暗黑字串數,當n>=3時,我們更新陣列;

2.更新規則:f(n)=2*f(n-1)+f(n-2)      f(n)表示輸入的整數為n時的暗黑字串數;

                     在計算f(n)

時,我們假設已知f(n-1),那麼我們只需要在長度為n-1的暗黑字串後面加上滿足條件的‘A’,‘B’,                       ‘C’即可,假如某長度為n-1的暗黑字串的最後兩個字元不相同(比如‘AB’),那麼我們在最後新增的字元只要不                         是這兩個字元之外的第三個字元(‘C’)就可以得到長度為n的暗黑字串,這時候我們有結論1:1個長度為n-1的                         暗黑字串可以得到2個長度為n的暗黑字串;
那麼如果最後兩個字元相同(比如‘AA’)呢?那就更簡單了,隨便加                       個字元都能得到長度為n的暗黑字串,這時候我們有結論2:1個長度為n-1的暗黑字串可以得到3個長度為n的                         暗黑字串;將結論1和2統一起來,我們有結論3:長度為n的暗黑字串個數等於長度為n-1的暗黑字串的個數                       再加上長度為n-1且最後兩個字元相同的暗黑字串個數;現在的我們要解決的問題就是長度為n-1且最後兩個字元                       相同的暗黑字串有多少個,那就要用到f(n-2)了,長度為n-2的暗黑字串只要加上一個和最後一位字元相同                       的字元,我們便可以得到長度為n-1且最後兩個字元相同的暗黑字串,那麼結論4就是,1個長度為n-2的暗黑字                         符串可以得到1個長度為n-1且最後兩個字元相同的暗黑字串;將結論3和4統一起來就是結論5,長度為n的暗黑                         字串個數等於長度為n-1的暗黑字串個數的2倍加上長度為n-2的暗黑字串的個數。