zoukankan      html  css  js  c++  java
  • 512. 解码方法

    512. 解码方法

    中文English

    有一个消息包含A-Z通过以下规则编码

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

    现在给你一个加密过后的消息,问有几种解码的方式

    样例

    样例 1:

    输入: "12"
    输出: 2
    解释: 它可以被解码为 AB (1 2) 或 L (12).
    

    样例 2:

    输入: "10"
    输出: 1
    

    注意事项

    我们不能解码空串,因此若消息为空,你应该返回0。
    消息的长度 n leq 100n100

    输入测试数据 (每行一个参数)如何理解测试数据?
     
    class Solution:
        """
        @param s: a string,  encoded message
        @return: an integer, the number of ways decoding
        """
        def numDecodings(self, s):
            # write your code here
            if not s or s == '0':return 0 
    
            dp = [[],[]]  
            dp[0] = [[s[0]]]
            for i in range(1,len(s)):
                dp[i%2] = []
                index = i%2
                for j in range(len(dp[index-1])):
                    #单独加
                    if (s[i]!= '0'):
                        add_d = dp[index-1][j] + [s[i]]
                        dp[index].append(add_d)
                    
                    #加尾数
                    end_num = dp[index-1][j][-1] + s[i]
                    if (int(end_num) <= 26):
                        dp[index-1][j][-1] = end_num
                        dp[index].append(dp[index-1][j])
            return  len(dp[len(s)%2-1])

    注:lintcode未通过,你的代码运行时间超过了限制,检查你的时间复杂度.

    class Solution:
        """
        @param s: a string,  encoded message
        @return: an integer, the number of ways decoding
        """
        """
        1.最后一步,A-Z之间,只能是f[i-1] + f[i-2]种方法
    
        10-26 且s[i-1] != 0
        f[i-1] + f[i-2]
    
        35 这种情况
        0 < s[i-1:i] < 10:
        f[i-1]
    
        10 or 20
        f[i-2]
    
        else
        0
        """
        def numDecodings(self, s):
            if not s or s == '0':return 0
    
            ##123,首个1只是作为12,情况下的1,2和12 这种各一种,12 的方法就是两种
            f = [1,1]
    
            for i in range(1,len(s)):
                if  10 < int(s[i-1:i+1]) <= 26 and int(s[i]) != 0:
                    f.append(f[i-1] + f[i])
                elif 0 < int(s[i:i+1]) < 10:
                    f.append(f[i])
                elif int(s[i-1:i+1]) == 10 or int(s[i-1:i+1]) == 20:
                    f.append(f[i-1])
                else:
                    f.append(0)
            #f多了一个值,f[len(s)]
            return f[len(s)]
  • 相关阅读:
    一个完整的SQL SERVER数据库全文索引的示例
    sqlhelper for access
    解决打开网站弹出下载文件
    18句话入门SQLServer XML
    c# winform 自动关闭messagebox 模拟回车
    jquery json
    用超级巡警批量清除被挂马的网页
    sqlhelper for sql
    SQL XML DML 数据修改
    post方法易错地方
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12984789.html
Copyright © 2011-2022 走看看