01 學生出勤記錄

2021-10-07 20:29:53 字數 2823 閱讀 9911

給定乙個正整數 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...