原題地址:https://oj.leetcode.com/problems/decode-ways/
題意:
A message containing letters from A-Z
is being encoded to numbers using the following mapping:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
解題思路:解碼有多少種方法。一般求“多少”我們考慮使用dp。狀態方程如下:
當s[i-2:i]這兩個字符是10~26但不包括10和20這兩個數時,比如21,那么可以有兩種編碼方式(BA,U),所以dp[i]=dp[i-1]+dp[i-2]
當s[i-2:i]等於10或者20時,由於10和20只有一種編碼方式,所以dp[i]=dp[i-2]
當s[i-2:i]不在以上兩個范圍時,如09這種,編碼方式為0,而31這種,dp[i]=dp[i-1]。
注意初始化時:dp[0]=1,dp[1]=1
代碼:
class Solution: # @param s, a string # @return an integer def numDecodings(self, s): if s=="" or s[0]=='0': return 0 dp=[1,1] for i in range(2,len(s)+1): if 10 <=int(s[i-2:i]) <=26 and s[i-1]!='0': dp.append(dp[i-1]+dp[i-2]) elif int(s[i-2:i])==10 or int(s[i-2:i])==20: dp.append(dp[i-2]) elif s[i-1]!='0': dp.append(dp[i-1]) else: return 0 return dp[len(s)]