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的实现:

 class Solution:
def numDecodings(self, s: str) -> int:
n = len(s)
if n == :
return
dp = [ for x in range(n + )]
dp[] = #空白字符串,有1种表示方式,就是空白字符串
if <= int(s[]) and int(s[]) <= :#第一位是1~9之间的数
dp[] = #有一种表示方式 for i in range(, n + ):
pre1 = int(s[i-:i])#当前位置转化的数字
pre2 = int(s[i-:i])#前一位和当前位置组成的数字
if <= pre1 and pre1 <= :#当前数字是1~9之间的数
dp[i] += dp[i - ]
if <= pre2 and pre2 <= :#前一位和当前位置组成的数字是10~26之间的数
dp[i] += dp[i - ]
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之间,因此'2'的解码数量与''的解码数量一样。

'' -> 'B' 是1种

'' + '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之间,因此'6'的解码数量与''的解码数量一样。

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

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

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

'2' -> 'B' 是1种

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

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

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

leetcode91的更多相关文章

  1. [Swift]LeetCode91. 解码方法 | Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  2. 【leetcode-91 动态规划】 解码方法

    一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1 ...

  3. Leetcode91.Decode Ways解码方法

    一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1 ...

  4. LeetCode91 Decode Ways

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...

  5. 【算法题12 解码方法decode way】

    1.来源LeetCode91 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请 ...

随机推荐

  1. CTF-练习平台-Misc之 这是一张单纯的图片??

    一.这是一张单纯的图片?? 分析图片,首先查看图片属性 没有发现有用的信息,再用WinHex打开 发现最后面有点眼熟,和ASCII表对应后发现是flag

  2. UVA11525 【Permutation】

    分析 简述"康托展开" 康托展开是一个全排列到一个自然数的双射,常用于构建hash表时的空间压缩.设有\(n\)个数\((1,2,3,4,-,n)\),可以有组成不同(\(n!\) ...

  3. 纯CSS绘制三角形(各种角度)类似于使用字符画法,根据位移不同,也可以使用两个元素画出三角边框

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  4. Jenkins进阶-获取git tags代码(2)

    配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...

  5. Linux C程序操作Mysql 调用PHP采集淘宝商品 (转)

    还是继续这个项目. 在上一篇Linux下利用Shell使PHP并发采集淘宝产品中,采用shell将对PHP的调用推到后台执行,模拟多线程. 此方法有一致命缺点,只能人工预判每个程序执行时间.如果判断时 ...

  6. dubbo实战

    http://blog.csdn.net/hejingyuan6/article/details/47403299

  7. ipconfig出现window IP configuration 。。

    我的电脑  右击 -->属性 ---->硬件---->设备管理器 安装以太网网卡 1.自动  电脑重新开机会自动提示安装 2.手动  下载以太网网卡驱动 ,选中合适类型(一般为int ...

  8. ORACLE11g 安装中xhost: unable to open display 问题解决纪实 (go)

    http://blog.csdn.net/mchdba/article/details/62235761 1,Xhosts报错 安装好vncserver,本地pc笔记本能通过vnc viewer远程连 ...

  9. ALGO-1_蓝桥杯_算法训练_区间k大数查询

    问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...

  10. 云-AWS-百科:AWS

    ylbtech-云-AWS-百科:AWS Amazon Web Services AWS是亚马逊公司旗下云计算服务平台,为全世界范围内的客户提供云解决方案.AWS面向用户提供包括弹性计算.存储.数据库 ...