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的实现:
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的更多相关文章
- [Swift]LeetCode91. 解码方法 | Decode Ways
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- 【leetcode-91 动态规划】 解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1 ...
- Leetcode91.Decode Ways解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1 ...
- LeetCode91 Decode Ways
题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...
- 【算法题12 解码方法decode way】
1.来源LeetCode91 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请 ...
随机推荐
- Boosting学习笔记(Adboost、GBDT、Xgboost)
转载请注明出处:http://www.cnblogs.com/willnote/p/6801496.html 前言 本文为学习boosting时整理的笔记,全文主要包括以下几个部分: 对集成学习进行了 ...
- test20181004 排列
题意 分析 容斥公式的意义 选了原图中\(x(x \geq i)\)条边的方案,重复了\(\binom{x}{i}\)次. 有多加多减,所以就是那个式子. 具体而言,对选了x条原图中的边的方案,总共加 ...
- laravel5.3 源码分析 Passport
laravel5.3,密码模式的授权认证过程.我会通过两部分内容分享以及查看passport的认证流程分享出来 第一部分:根据官方文档,通过Composer安装Passport 文档地址:http:/ ...
- Oracle 多行合并一行 方法
假如有如下表,其中各个i值对应的行数是不定的 SQL> select * from t; I A D ---------- ---------- --------------- ...
- weexpack 使用
weexpack 的github地址:https://github.com/weexteam/weex-pack weex-toolkit: 初始化的项目是针对开发单个 Weex 页面而设计的,也就是 ...
- sqlserver 同义名的使用
USE [ccflow5]GOdrop synonym ccusergo/****** Object: Synonym [dbo].[ccuser] Script Date: 11/12/20 ...
- tyvj1659中中救援队
题目:http://www.joyoi.cn/problem/tyvj-1659 发现每条边要走两次,每个点要走它连接的边数次. 所以把边的权值赋成 本身的值+两个端点的点权,求最小生成树即可. !边 ...
- 杂项:Office Visio
ylbtech-杂项:Office Visio Office Visio 是一款便于IT和商务人员就复杂信息.系统和流程进行可视化处理.分析和交流的软件.使用具有专业外观的 Office Visio ...
- Game of War - Fire Age 有何特别之处?
作者:福克斯007 链接:https://www.zhihu.com/question/21611550/answer/52458767来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...
- HTML5中对于网络是否断开的检测.很有意思哦
//事件的封装 var EventUtil = { addHandler: function (element, type, handler) {//注册事件 if (element.addEvent ...