91 解碼方法(動態規劃)

2022-07-01 01:03:12 字數 1202 閱讀 4475

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

'a' -> 1

'b' -> 2

...'z' -> 26

給定乙個只包含數字的非空字串,請計算解碼方法的總數。

初思路:

一看到本題,我就想用回溯演算法來遞迴,因為遇到 10但是遞迴方法時間複雜度高,存在大量的重複計算,比如 分開轉化s[0],s[1] 與合併s[0:2],還是回到處理 s[2:]的路徑上,所以我再去看看答案。

觀後思路:

本題確實就是 爬樓梯問題,動態轉移方程:   dp[i] = dp[i-1] + dp[i-2]  但是多了一些限制條件

為什麼可以說是爬樓梯問題(動態規劃)呢,因為它具有後無效性,前面算出來後與後面無關。

收穫:1.狀態轉移方程很難寫,不同情況對cur有不同的賦值: 

11-19,21-26: cur = fitst + second

10,20 cur = first 

出現0的情況還要分辨一下特殊情況,直接return0 

if int(s[point-1:point+1]) > 10 and int(s[point-1:point+1]) <=26 and int(s[point-1:point+1]) !=20 :

cur = first + second

elif int(s[point-1:point+1]) == 10 or int(s[point-1:point+1]) ==20 : cur = first

elif int(s[point-1:point+1]) > 26: cur = second

elif s[point-1:point+1] == '00':

flag = 0

break

# <10 就是 s[point-1] =='0'

else: 

if int(s[point-2]) == 1 or int(s[point-2]) == 2: cur = second

#出現 505 這種不能翻譯

else:

flag = 0 

break

first,second = second,cur

point += 1

下圖**,leetcode精選python答者 nfgc 

leetcode 91題 解碼方法(動態規劃)

一條包含字母 a z 的訊息通過以下方式進行了編碼 a 1 b 2 z 26 給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3 解釋 它可以解碼為 bz 2 26 vf 22 6 或...

91 解碼方法

方法一 動態規劃法 該問題可以通過動態規劃的方法進行求解,我們假設s i 代表一條長度為i的訊息,對應的解碼方法的總數為dp i 那麼這個值的大小和dp i 1 以及dp i 2 相關,因為解碼時只有一位或者兩位字元可以作為乙個原碼看待。當我們假設這條訊息的最後一位作為原碼時,它的取值範圍為 1 9...

91 解碼方法

一條包含字母a z的訊息通過以下方式進行了編碼 a 1 b 2 z 26給定乙個只包含數字的非空字串,請計算解碼方法的總數。示例 1 輸入 12 輸出 2 解釋 它可以解碼為 ab 1 2 或者 l 12 示例 2 輸入 226 輸出 3 解釋 它可以解碼為 bz 2 26 vf 22 6 或者 b...