【LeetCode with Python】 Decode Ways

博客域名: http://www.xnerv.wang
原题页面: https://oj.leetcode.com/problems/decode-ways/
题目类型:动态规划
难度评价:★★★★
本文地址: http://blog.csdn.net/nerv3x3/article/details/2921931

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问题,需要注意的除了边界条件的处理,还有关于'0'的注意点。'0'本身可以构成'10','20'这样合法的双字节码,但其它情况的'0'就是异常数据了。这道题目跟atoi一样,都属于文字游戏,题意本身并没有说清楚要“尽量多地解码出字符串”,因此一开始我一旦发现有多余的'0'就直接认为解码失败范围0,结果提交后发现不对。此外,输入的参数s也可能是个空串,从验证的结果看来这种情况下应该返回0,题目也没有说清楚。
另外对于很大一部分DP题目,内存都是可以优化的,这里也不必采用n * 2大小的二维数组,只需保留两行,即2 * 2的空间消耗即可。
最后,还要特别说明一下新学到的一招。起先还想像C语言一样写个swap函数,用一个临时变量tmp来交换solu_arr1和solu_arr2两个引用,后来发现竟然可以用solu_arr1, solu_arr2 = solu_arr2, solu_arr1这种简便的写法,大赞Python!

class Solution:
    # @param s, a string
    # @return an integer
    def numDecodings(self, s):
        if None == s or 0 == len(s) or '0' == s[0]:
            return 0
        solu_arr1 = [0, 1]
        solu_arr2 = [0, 0]
        for i in range(1, len(s) + 1):
            cur_ch = s[i - 1]
            last_ch = s[i - 2] if 1 != i else ''
            if cur_ch >= '1' and cur_ch <= '9':
                solu_arr2[0] = solu_arr1[0] + solu_arr1[1]
            else:
                solu_arr2[0] = 0
            double_ch = last_ch + cur_ch
            if '' == last_ch or '0' == last_ch or int(double_ch) > 26:
                solu_arr2[1] = 0
            else:
                solu_arr2[1] = solu_arr1[0]
            solu_arr1, solu_arr2 = solu_arr2, solu_arr1    # swap

        return solu_arr1[0] + solu_arr1[1]

你可能感兴趣的:(LeetCode,with,Python,LeetCode,with,Python)