LeetCode 91. Decode Ways
问题链接
LeetCode 91
题目解析
A~Z对应数字1~26,给出一段数字串,求破译方法数。
解题思路
动态规划。关键在于分类,定义 \(dp[i]\) 为前i个字符的解密方法数,初始化为0。
小小注意:空数字串时返回0,非空时定义dp[0]=1,可以想象成没有也是一种解密方法(莫急待会再理解)。
对于某一数字 \(s[i]\):
- 单独解密:s[i] != 0,代表其可以单独解密(单数字→单字母),那么 \(dp[i] += dp[i-1]\);
- 复合解密:即俩数字→单字母。注意判断条件,s[i-1]非零且二者组成数字∈[10, 26],这种情况 \(dp[i] += dp[i-2]\)。
注意,二者不是if...else if,而是并列判断的,因为二者可共存。
实际操作时在原数字串前加了一个空字符,或许还是有些不懂。
举一个简单例子或许好一些。对于数字串1024:dp[0] = 1;首先判断数字1,dp[1] += dp[0] = 1;接着数字0,dp[2] += dp[1] = 1;然后判断数字2,dp[3] += dp[2] = 1;最后判断数字4,dp[4] += dp[3]; dp[4] += dp[2]; 结果为2。
你理解了为什么加一个前导空格以及 \(dp[0] = 0\) 了吗?
参考代码
class Solution {
public:int numDecodings(string s) {s = ' ' + s;int len = s.size();if (len <= 1) return 0;vector<int> dp(len);dp[0] = 1;for (int i = 1; i < len; i++) {dp[i] = 0;if (s[i] != '0')//单独dp[i] += dp[i-1];if (i-2 >= 0 && s[i-1] != '0' && (s[i-1]-'0')*10+(s[i]-'0')<=26)//联合dp[i] += dp[i-2];}return dp[len-1];}
};
改进
为了节省空间,可以将dp数字省去,只用两个变量a、b代表s[i-1]和s[i-2]的解码方法,思路相同,不断替换,也可得到答案。
从第二个字符(i=1)开始,判断当前字符如果为'0',说明当前字符不能单独解密,a=0。然后判断前一字符,如果前面的字符是1或者2时,即可以联合解密,则更新a = a + b,然后b = a - b,其实是将b赋值为之前的a;如果不满足这些条件的话,那么b = a。参考代码:
class Solution {
public:int numDecodings(string s) {if (s.empty() || s.front() == '0') return 0;int a = 1, b = 1;for (int i = 1; i < s.size(); i++) {if (s[i] == '0') a = 0;if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6')) {a = a + b;b = a- b;} else {b = a;}}return a;}
};
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
转载于:https://www.cnblogs.com/AlvinZH/p/8534444.html
LeetCode 91. Decode Ways相关推荐
- 【DFS + 记忆化递归 + DP】LeetCode 91. Decode Ways
LeetCode 91. Decode Ways Solution1:我的答案 还是记录一下,最容易想到的是DFS,但是在第223/238个case上就超时了... class Solution { ...
- [LeetCode]91.Decode Ways
题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A ...
- LeetCode 91 Decode Ways(编码方式)(*)
原文 A message containing letters from A-Z is being encoded to numbers the following mapping: 'A' -> ...
- leetcode 91. Decode Ways | 91. 解码方法(动态规划)
题目 https://leetcode.com/problems/decode-ways/ 题解 dp 问题,首先用模拟的办法试一下,理清楚状态转移关系. 当走到 i 位置时,i 有两种选择: i 不 ...
- [dp] LeetCode 91. Decode Ways
输入:一个字符串,只包含0-9的字符. 输出:解码种类 规则:有一种信息映射规则 A->1,B->2-Z->26. 例如输入'1',只能解码为A. 输入'12',可以解码为'AB', ...
- 【LeetCode】91. Decode Ways 解题报告(Python)
[LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...
- 【重点!DP】LeetCode 639. Decode Ways II
LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...
- 91 Decode Ways
91 Decode Ways dp解法 O(1) space class Solution:# @param {string} s# @return {integer}def numDecodings ...
- 91 Decode Ways
为什么我常常对做题产生恐惧,因为可能为了一个不算难的问题不知不觉绕进去2个小时,这显然是不值得的.这题就是如此. 还要注意,java && 的优先级高于||的优先级,而不是同级. pu ...
最新文章
- 前端工程师算法(一)
- 使用Hive和iReport进行大数据分析
- 在Centos7 更改Docker默认镜像和容器的位置
- 关于内存中栈和堆的区别[转]
- php提交表单并发送邮件,php提交表单发送邮件的方法
- kettle组件-应用
- 苹果Mac分享几个爱用音乐播放器
- GridView 换行设置
- 文件管理系统(开发文档)
- 金蝶k3单据编码规则_金蝶K3各单据操作步骤
- 2014小米校园招聘笔试(10.13北京)
- JAVA面向对象 从0.5到1
- SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口
- 黑马程序员---继承(下)
- java实现最大公约数
- 复制链接到剪切板php,剪切复制粘贴
- 青龙面板--京东试用申请
- 如何准确的向工程师传达动效设计?
- react将表格动态生成视频列表【代码】【案例】
- 中兴B863AV3.1-M2_卡刷固件_萌虎开机动画
热门文章
- windows7下载python教程-Windows 7下Python Web环境搭建图文教程
- python推荐书籍-有哪些 Python 经典书籍?
- python安装步骤图解-Python安装-小白图文教程(精)
- python代码大全下载-最全Python算法实现资源汇总!
- python做些什么-学会Python后都能做什么?网友们的回答简直不要太厉害
- python画二维散点图-python3怎样画二维点图
- python好学吗mooc中文网-Python的N种玩法_中国大学MOOC(慕课)
- python画曲线图例-如何使用python画曲线图
- python经典案例-Python递归的经典案例
- 流程的python-什么时候学流畅的python合适?