卖萌的弱渣

I am stupid, I am hungry.

Decode Ways

A message containing letters from A-Z is being encoded to numbers using the following mapping:

1
2
3
4
'A' -> 1
'B' -> 2
...
'Z' -> 26

Given an encoded message containing digits, determine the total number of ways to decode it.

Example:

Given encoded message “12”, it could be decoded as “AB” (1 2) or “L” (12).

The number of ways decoding “12” is 2.

Solution

解码有多少种方法。一般求“多少”我们考虑使用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

(Decode-Ways.py) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 class Solution(object):
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
        #dp[i] = dp[i-1]+dp[i-2]
        # i: length of s
        if not s:
            return 0
        # "01" -> 0
        if s[0] == '0':
            return 0

        # any s has "00" will not get result:
        if "00" in s:
            return 0

        dp = [0]*(len(s)+1)
        dp[0] = 1
        dp[1] = 1

        for i in range(2,len(s)+1):
            # [10,26] except 10 and 20
            if 10<=int(s[i-2:i])<=26 and s[i-1] !='0':
                dp[i] = dp[i-1]+dp[i-2]
            # 10,20
            elif s[i-2:i] == '10' or s[i-2:i] == '20':
                dp[i] = dp[i-2]
            # 1-9
            elif s[i-1] != '0':
                dp[i] = dp[i-1]
            else:
                return 0
        return dp[len(s)]