码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Decode Ways

时间:2017-07-23 11:21:33      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:遍历   assert   tps   range   个数   object   版本   main   mod   

LeetCode解题之Decode Ways


原题

如今有例如以下的字母与数字的相应关系:1-A, 2-B, …26-Z。给定一个由数字组成的字符串。推断依照上面的映射能够转换成多少种不同的字符串。

注意点:

  • 假设字符不能正常转换。如”70”,那么返回0

样例:

输入: s = “12”

输出: 2(包含”AB”(1 2)和”L”(12))

解题思路

第一感觉就是动态规划,先写了一个从前往后的版本号,要复杂的分类要论,代码非常乱,后来发现从后開始遍历更加easy。来看一下递推式,假设原先的字符串为”y231”,如今在它之前加一个数字得到”xy231”,假设x不为0,此时,假设”xy”不在1-26之间,那么原先能转换的种类不变。仅仅是在每一个字符串之前添加一个x转换后的字母;假设”xy”在1-26之间,那么除了在原先每一个字符串之前添加x转换后的字母,还可能是在”231”转化之后的字符串前添加”xy”转化的字母。那假设x等于0呢。此时是一个非法字符串。让它默觉得0。但不能跳出循环,由于在前面继续添加数字可能将字符串变为合法的。

AC源代码

class Solution(object):
    def numDecodings(self, s):
        """
        :type s: str
        :rtype: int
        """
        length = len(s)
        if length == 0:
            return 0
        dp = [0 for __ in range(length + 1)]
        dp[length] = 1
        dp[length - 1] = 1 if s[length - 1] != ‘0‘ else 0
        for i in range(length - 2, -1, -1):
            if s[i] != ‘0‘:
                dp[i] = dp[i + 1] + dp[i + 2] if int(s[i:i + 2]) <= 26 else dp[i + 1]
        return dp[0]


if __name__ == "__main__":
    assert Solution().numDecodings("110") == 1
    assert Solution().numDecodings("40") == 0

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源代码。

LeetCode Decode Ways

标签:遍历   assert   tps   range   个数   object   版本   main   mod   

原文地址:http://www.cnblogs.com/jzdwajue/p/7223895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!