leetcode91題(解碼方法)
?分析題目:
1.這是一種解碼,就是給多個數字組成的字符串,把這些數字解碼成字母,看看一共有多少種
2.如果一個數字前有前導0就不合法,比如06,這與6不同,所以06不能解碼
算法原理:
狀態表示:經驗+題目(以i位置為結尾時,巴拉巴拉)
根據題目,狀態就是以i位置為結尾時,一共有多少總解碼方式
所以dp[i]:以i結尾時有多少總解碼方式
狀態轉移方程:根據最近的一步,劃分問題
成功與失敗都有可能,所以最后的dp[i]編寫代碼時要注意?
?初始化:保證填表時不會越界
根據狀態方程我們看出0和1可能會越界,所以我們需要單獨填0/1的位置,0的位置就是一個字符,那它如果是1<=a<=9的化就是合法的,dp[0]:表示的是以0位置為結尾,總的解碼方法
1可以自己畫圖理解以下
填表順序:
從左往右
返回值:
dp[n-1]?
代碼編寫
?細節問題:
有沒有發現我們的初始化很繁瑣
這里介紹處理邊界問題和初始化的技巧:
如果覺得初始化0和1的位置很繁瑣,那就多開一個空間,讓0的位置沒用
但注意:要保證后面的填表是正確的,比如你填2位置的時候,2是進入循環填的,如果你一開始0的位置初始化為0,2的填表就可能出錯,dp[2]=dp[1]+dp[0];這時候即使你組合和單獨都解碼成功,2都會填成1;所以我們要注意一開始0的位置要初始化為1才能保證后面填表正確
要注意下標的映射關系,dp[i-1]=s[i];找解碼方式的時候要注意dp和s下標映射關系