【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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值