[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];
    }
}

猜你喜欢

转载自blog.csdn.net/u013383813/article/details/83574515