zoukankan      html  css  js  c++  java
  • leetcode91

    class Solution {
        public int numDecodings(String s) {
            if(s.length()==0){
                return 0;
            }
            int[] dp = new int[s.length()];
            dp[0] = s.charAt(0)=='0'?0:1;
            if(s.length()==1){
                return dp[0];
            }
            int k = s.charAt(0) > '0' && s.charAt(1) > '0'? 1:0;
            dp[1] = k + (s.charAt(0) == '1' || s.charAt(0) == '2' && s.charAt(1) <= '6' ? 1:0);
            for (int i = 2; i < dp.length; i++) {
                if(s.charAt(i)!='0'){
                    dp[i] += dp[i-1];
                }
                if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6'){
                    dp[i] += dp[i-2];
                }
            }
            return dp[s.length()-1];
        }
    }

    补充一个python的实现:

     1 class Solution:
     2     def numDecodings(self, s: str) -> int:
     3         n = len(s)
     4         if n == 0:
     5             return 0
     6         dp = [0 for x in range(n + 1)]
     7         dp[0] = 1#空白字符串,有1种表示方式,就是空白字符串
     8         if 1 <= int(s[0]) and int(s[0]) <= 9:#第一位是1~9之间的数
     9             dp[1] = 1#有一种表示方式
    10 
    11         for i in range(2, n + 1):
    12             pre1 = int(s[i-1:i])#当前位置转化的数字
    13             pre2 = int(s[i-2:i])#前一位和当前位置组成的数字
    14             if 1 <= pre1 and pre1 <= 9:#当前数字是1~9之间的数
    15                 dp[i] += dp[i - 1]
    16             if 10 <= pre2 and pre2 <= 26:#前一位和当前位置组成的数字是10~26之间的数
    17                 dp[i] += dp[i - 2]
    18         return dp[n]

    参考:https://leetcode.com/problems/decode-ways/discuss/30529/Readable-Python-DP-Solution 

    本题关键在于第11行到15行之间的逻辑,更新dp[i]的规则。

    dp[i]表示,前i个字符(从1开始计算)有几种解码方式。

    如果当前字符s[i-1] 是[1,9]之间的数字,则把当前字符独立出来,可以在s[0]...s[i-2]这个子串的每一种表示方式后面,多一个A~I之间的单独的字母就可以完成。

    因此其表示方式的数量与s[0]...s[i-2]的表示数量一样,只是对应每一种具体的组成时多了一个字母,即dp[i] += dp[i-1]。

    入股当前字符和其前一位字符,可以组成一个数字是[10,26]之间的,则把这两个字符独立出来,可以在s[0]...s[i-3]这个字串的每一种表示方式后面,

    多一个J~Z之间的单独的字母就可以完成。因此其表示方式的数量与s[0]...s[i-3]的表示数量一样,只是对应每一种具体的组成时多了一个字母,即dp[i] += dp[i-2]。

    以'226'为例,这个字符串可以分成三种情况:

    1、'2' '2' '6' -> B B F

    2、'22' '6' -> V F

    3、'2' '26' -> B Z

    在i=2时,dp = [1,1,0,0],

    第一步是判断s[1]字符,由于s[1]字符转化成数字是2,在1~9之间,因此'22'的解码数量与'2'的解码数量一样。

    '2' -> 'B' 是1种

    '2' + '2' ->'B' + 'B' 也是1种

    第二步判断s[0]和s[1]组成的字符,由于这两个字符所组成的数字是22,在10~26之间,因此'22'的解码数量与''空白串的解码数量一样。

    '' -> '' 是1种

    '' + '22' -> '' + 'V' 也是1种

    这两步判断加到一起,等于2,就是dp[2]的值。

    在i=3时,dp[1,1,2,0]

    第一步是判断s[2]字符,由于s[2]字符转化成数字是6,在1~9之间,因此'226'的解码数量与'22'的解码数量一样。

    '22' -> 'BB'    '22' -> 'V' 是2种

    '22' + '6' -> 'BB' + 'F'   '22' + '6' -> 'V' + 'F' 也是2种

    第二步是判断s[1]和s[2]组成的字符,由于这两个字符所组成的数字是26,在10~26之间,因此'226'的解码数量与'2'的解码数量一样。

    '2' -> 'B' 是1种

    '2' + '26' -> 'B' + 'Z' 也是1种

    这两步判断加到一起是2 + 1 等于3,就是dp[3]的值。

    此时循环完毕,返回dp[3]即为所求。

  • 相关阅读:
    年度总结会议
    2018年度移动创新竞赛组总结
    移动竞赛组2019计划
    task ':app:mergeDebugResources' property 'aapt2FromMaven'
    SQL SERVER : 'GO' 附近有语法错误问题
    Visual C# 访问 SQLserver 数据库
    数据库系统概论 第三章 课后作业
    数据库系统概论 第三章 建表&插入SQL语句
    【pyqt5 QtDesigner SQLserver2017】 Python3.6 Demo
    【Win10 + PyCharm + Python + PyQt5 + pymssql】 Python 3.6 访问 SQLserver 2017(对话框界面)1
  • 原文地址:https://www.cnblogs.com/asenyang/p/9826815.html
Copyright © 2011-2022 走看看