125. Leetcode 91. 解码方法 (动态规划- 字符串系列)
?
步驟一、確定狀態(tài):
確定dp數(shù)組及下標(biāo)含義 dp[i]表示的是到i這個(gè)位置的字符串的解碼方法
步驟二、推斷狀態(tài)方程:
dp[i]的推導(dǎo)會(huì)取決于當(dāng)前s[i]的字符情況以及前一位字符,具體如下:
如果當(dāng)前的s[i]=='0': 這說明自己無法單獨(dú)解碼,需要跟著前面一位進(jìn)行解碼,但是這 時(shí)候前面的一位必須是1或者2, 此時(shí)dp[i]=dp[i-2](下標(biāo)為1處單獨(dú)判斷),否則此串無 法解碼,返回0
如果前面的s[i-1]=='1': 這說明當(dāng)前的s[i]可以自己解碼,也可以和前面的一塊解碼,所 以解碼方法是dp[i] = dp[i-1] + dp[i-2](下標(biāo)為1處單獨(dú)判斷)
dp[i-1]表示自己解碼,dp[i-2]表示和前面一塊解碼
如果前面的s[i-1]=='2'且當(dāng)前的s[i]在1-6之間: 這時(shí)候s[i]同樣可以單獨(dú)解碼,可以和 前面一塊解碼,動(dòng)態(tài)方程和上面一樣
除去上面這些特征情況,剩下的就是是s[i]單獨(dú)解碼的情況了,此時(shí)dp[i]=dp[i-1]
步驟三、規(guī)定初始條件:
初始條件:
全局初始化為0
步驟四、計(jì)算順序: 從1開始正向遍歷
class Solution:def numDecodings(self, s: str) -> int:if len(s) == 0 or s[0] == "0":return 0dp = [0 for i in range(len(s))]dp[0] = 1for i in range(1, len(s)):if s[i] == '0':if s[i-1] not in ['1','2']:return 0if i == 1:dp[i] = 1else:dp[i] = dp[i-2]elif s[i-1] == '1' or s[i-1] == '2' and s[i] in ['1','2','3','4','5','6']:if i == 1:dp[i] = 2else:dp[i] = dp[i-1] + dp[i-2]else:dp[i] = dp[i-1]return dp[-1]總結(jié)
以上是生活随笔為你收集整理的125. Leetcode 91. 解码方法 (动态规划- 字符串系列)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 124. Leetcode 583. 两
- 下一篇: 126. Leetcode 剑指 Off