一條包含字母 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顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於...