給定乙個正整數 n,返回長度為 n 的所有可被視為可獎勵的出勤記錄的數量。 答案可能非常大,你只需返回結果mod 109 + 7的值。
學生出勤記錄是只包含以下三個字元的字串:
『a』 : absent,缺勤
『l』 : late,遲到
『p』 : present,到場
如果記錄不包含多於乙個』a』(缺勤)或超過兩個連續的』l』(遲到),則該記錄被視為可獎勵的。
首先,假設字串只包含字元l
ll 和 p
pp。a
aa 產生的影響放在後面考慮。
假設f [n
]f[n]
f[n]
表示長度為 n
nn 的可獎勵字串的數目(只包含字母l
ll 和 p
pp)。下圖說明計算 f[n
]f[n]
f[n]
的過程:
上**釋了如何將長度為 n
nn 的可獎勵字串拆成結尾是l
ll或者 p
pp 的長度為 n−1
n-1n−
1 的 2 個字串。如果長度為 n−1
n-1n−
1 的字串是可獎勵的,那麼將 p
pp 接在這個字串後面,得到長度為 n
nn 的字串,一定也是可獎勵的。因此,每乙個長度為 n−1
n-1n−
1 的字串後面接上 p
pp 都可以對應乙個長度為 n
nn 的字串,這使得 f[n
−1]f[n-1]
f[n−1]
對 f[n]
f[n]
f[n]
可以產生貢獻。
對於以 l
ll 結尾的字串,是否可獎勵取決於對應的長度為 n−3
n-3n−
3 的字串。所以我們需要考慮所有長度為 n−3
n-3n−
3 的可獎勵字串。在 4 種可能的組合中,第四種也就是以 llll
ll開始的會導致乙個不可獎勵字串。由於我們在考慮長度為 n−3
n-3n−
3 的可獎勵字串,為了避免在 n−1
n-1n−
1 的時候已經是不可獎勵的,第四種情況的不可獎勵數目,可認為是長度為 n−4
n-4n−
4 的字串必須以 p
pp 結尾對應的獎勵數目。
所以除了在長度為 n−4
n-4n−
4 的可獎勵字串後面的 pll
pllpl
l ,其他所有長度為 n−1
n-1n−
1 的可獎勵字串都可以對長度為 n
nn 的可獎勵字串做出貢獻。所以 f[n
−1]−
f[n−
4]f[n-1] - f[n-4]
f[n−1]
−f[n
−4] 會對 f[n
]f[n]
f[n]
產生貢獻。
所以,遞迴表示式為:
f [n
]=2f
[n−1
]−f[
n−4]
f[n] = 2f[n-1] - f[n-4]
f[n]=2
f[n−
1]−f
[n−4
]現在,我們需要考慮加入字元 a
aa 造成的影響。我們知道最多可以將 1 個 a
aa 放入乙個可獎勵字串中,所以我們考慮如下兩種情況:
1、沒有 a
aa:可獎勵字串數目就是 f[n
]f[n]
f[n]
;2、有乙個 a
aa:這個 a
aa 可能出現在 n
nn 個位置中的任何乙個位置。如果 a
aa 出現在字串的位置 i
ii, 可獎勵字串的總數為: ∑i=
1n(f
[i−1
]∗f[
n−i]
)\sum_^ (f[i-1] * f[n-i])
∑i=1n
(f[i
−1]∗
f[n−
i]).
我們每次計算 f[i
]f[i]
f[i]
都需要使用遞迴函式,直到走到字串最開始的位置。如果我們使用記錄下來的 f[j
]f[j]
f[j]
去更新 f[i
]f[i]
f[i]
,我們可以節省非常大量的計算時間.
class
solution
:def
checkrecord
(self, n:
int)
->
int:
f =[1
,2,4
,7]for i in
range(4
,n+1):
((2*f[i-1]
)%1000000007+(
1000000007
-f[i-4]
))%1000000007
)sum
= f[n]
for i in
range(1
,n+1):
sum+=
(f[i-1]
* f[n-i])%
1000000007
return
sum%
1000000007
LeetCode 學生出勤記錄 I
給定乙個字串來代表乙個學生的出勤記錄,這個記錄僅包含以下三個字元 a absent,缺勤 l late,遲到 p present,到場 如果乙個學生的出勤記錄中不超過乙個 a 缺勤 並且不超過兩個連續的 l 遲到 那麼這個學生會被獎賞。你需要根據這個學生的出勤記錄判斷他是否會被獎賞。示例 1 輸入 ...
551 學生出勤記錄I
給定乙個字串來代表乙個學生的出勤記錄,這個記錄僅包含以下三個字元 a absent,缺勤 l late,遲到 p present,到場 如果乙個學生的出勤記錄中不超過乙個 a 缺勤 並且不超過兩個連續的 l 遲到 那麼這個學生會被獎賞。你需要根據這個學生的出勤記錄判斷他是否會被獎賞。示例 1 輸入 ...
551 學生出勤記錄 I(簡單)
給定乙個字串來代表乙個學生的出勤記錄,這個記錄僅包含以下三個字元 a absent,缺勤 l late,遲到 p present,到場 如果乙個學生的出勤記錄中不超過乙個 a 缺勤 並且不超過兩個連續的 l 遲到 那麼這個學生會被獎賞。class solution def checkrecord s...