劃分型動態規劃 解碼方法

2021-10-18 23:02:40 字數 1521 閱讀 4855

一條包含字母 a-z 的訊息通過以下方式進行了編碼:

『a』 -> 1

『b』 -> 2

…『z』 -> 26

給定乙個只包含數字的非空字串,請計算解碼方法的總數。題目資料保證答案肯定是乙個 32 位的整數。

示例 1:

輸入:s = "12"

輸出:2

解釋:它可以解碼為 "ab"(1 2)或者 "l"(12)。

示例 2:

從題目的提問方式能夠很明顯的看出這是乙個技術型別的動態規劃。

解密數字串即劃分成若干數字,每段數字對應乙個字母。

最後一步(最後一段):對應乙個字母,最後乙個字母可能會對應兩個數字,因為字母對應的數字1-26,從10之後就是兩位數字。

因此如果需要解密n個字元的解密方式數,需要知道數字串前n-1和n-2個字元的解密方式數。

所以我們可以假設f[i]表示數字串s前i個數字解密成字母串的方式數。

假設f[i]表示數字串s前i個數字解密成字母串的方式數

初始條件:f[0]=1,即空串有一種解密方式

邊界情況:如果i=1,只看最後乙個數字

從小到大的方式

答案是f[n]

時間複雜度o(n),空間複雜度o(n)

class

solution

:def

numdecodings

(self, s:

str)

->

int:

iflen

(s)==0:

return

for i in

range

(len

(s))

:if i!=

'0':

s=s[i:

]break

dp =[0

for i in

range

(len

(s)+1)

]iflen(s)==0

:return

dp[0]

=1for i in

range

(len

(s)+1)

:if s[i-1]

in"123456789"

:#python沒有char型別,不能用s[i-1]-'0'

dp[i]

+=dp[i-1]

if i>1:

j =(int

(s[i-2]

))*10

+int

(s[i-1]

)#新學會的強制轉換,或者int(s[i:i+2])

if j<=

26and j>=10:

dp[i]

+=dp[i-2]

return dp[

len(s)

]

劃分型動態規劃 書籍複製

給定 n 本書,第 i 本書的頁數為 pages i 現在有 k 個人來影印這些書籍,而每個人只能影印編號連續的一段的書,比如乙個人可以影印 pages 0 pages 1 pages 2 但是不可以只影印 pages 0 pages 2 pages 3 而不影印 pages 1 所有人影印的速度是...

91 解碼方法(動態規劃)

一條包含字母 a z 的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。初思路 一看到本題,我就想用回溯演算法來遞迴,因為遇到 10但是遞迴方法時間複雜度高,存在大量的重複計算,比如 分開轉化s 0 s 1 與合併s 0 2 還是回到處理 s...

動態規劃 劃分型 能量項鍊

能量項鍊 總時間限制 10000ms 單個測試點時間限制 1000ms 記憶體限制 65536kb 描述 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於...