1. 程式人生 > >[LeetCode] 91. Decode Ways

[LeetCode] 91. Decode Ways

題:https://leetcode.com/problems/decode-ways/description/

題目

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

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

Given a non-empty string containing only digits, determine the total number of ways to decode it.

Example 1:

Input: "12"
Output: 2
Explanation: It could be decoded as "AB" (1 2) or "L" (12).

Example 2:

Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).

思路

題目大意

由 字母 -> 數字 的對映表,推算出給定一個 數字字串,最多有多少種對應的 字母字串。

解題思路

第一版

這題和 爬梯子 的題很相似。字母對應的 數字 有1位和2位。
設 dp狀態為:dp[i] ,字串s[:i] 對應字串的最大個數。
狀態轉移方程為:
dp[i] =(dp[i-2] if s[i-2:i] 存在對應的字元 else 0) + (dp[i-1] if s[i-1:i] 存在對應的字元 else 0 )

初始化 dp[0] = 1,dp[1] =1 但需要判斷 s[0] !=0。

由於 dp只用到前兩個狀態,所以這裡用 dp[0-2] 表示。

最簡化程式碼

class Solution:
    sdict = {}
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
        if  s[0] == '0':
            return 0
        dp = [1,1,1]

        for i in range(2,
len(s) + 1): dp[2] = (dp[1] if 0<int(s[i-1:i])<10 else 0) + (dp[0] if 9<int(s[i-2:i])<27 else 0) dp[0] = dp[1] dp[1] = dp[2] return dp[2]

完整程式碼

class Solution:
    sdict = {}
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
        slen = len(s)
        if slen == 0:
            return 1
        elif slen == 1 or s[0] == '0':
            return 1 if 1<= int(s[0]) <= 9 else 0
        dp = [1,1,0]

        for i in range(2,slen + 1):
            dp[2] = (dp[1] if 0<int(s[i-1:i])<10 else 0) + (dp[0] if 9<int(s[i-2:i])<27 else 0)
            dp[0] = dp[1]
            dp[1] = dp[2]
        return dp[2]

第二版

java 版

class Solution {
    public int numDecodings(String s) {
        int slen = s.length();
        int[] dp = new int[slen+1];
        dp[0] = 1;
        dp[1] = 1;
        if(s.charAt(0)=='0')
            dp[1] = 0;
        for(int i = 2;i<=slen;i++){
            dp[i] = 0;
            if(s.charAt(i-1)!='0')
                dp[i] = dp[i-1];
            int dval = Integer.valueOf(s.substring(i-2,i));
            if(dval>=10 && dval<=26)
                dp[i] += dp[i-2];
        }
        return dp[slen];
    }
}

二維 陣列版

class Solution {
    public int numDecodings(String s) {
        int slen = s.length();
        int[] dp = new int[slen+1];
        dp[0] = 1;
        dp[1] = s.charAt(0) == '0' ? 0 : 1;
        for(int i = 2;i<=slen;i++){
            dp[i] = 0;
            if(s.charAt(i-1)!='0')
                dp[i] += dp[i-1];
            int dval = Integer.valueOf(s.substring(i-2,i));
            if(dval>=10 && dval<=26)
                dp[i] += dp[i-2];
        }
        return dp[slen];
    }
}