问题链接

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相关推荐

  1. 【DFS + 记忆化递归 + DP】LeetCode 91. Decode Ways

    LeetCode 91. Decode Ways Solution1:我的答案 还是记录一下,最容易想到的是DFS,但是在第223/238个case上就超时了... class Solution { ...

  2. [LeetCode]91.Decode Ways

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

  3. LeetCode 91 Decode Ways(编码方式)(*)

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

  4. leetcode 91. Decode Ways | 91. 解码方法(动态规划)

    题目 https://leetcode.com/problems/decode-ways/ 题解 dp 问题,首先用模拟的办法试一下,理清楚状态转移关系. 当走到 i 位置时,i 有两种选择: i 不 ...

  5. [dp] LeetCode 91. Decode Ways

    输入:一个字符串,只包含0-9的字符. 输出:解码种类 规则:有一种信息映射规则 A->1,B->2-Z->26. 例如输入'1',只能解码为A. 输入'12',可以解码为'AB', ...

  6. 【LeetCode】91. Decode Ways 解题报告(Python)

    [LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...

  7. 【重点!DP】LeetCode 639. Decode Ways II

    LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...

  8. 91 Decode Ways

    91 Decode Ways dp解法 O(1) space class Solution:# @param {string} s# @return {integer}def numDecodings ...

  9. 91 Decode Ways

    为什么我常常对做题产生恐惧,因为可能为了一个不算难的问题不知不觉绕进去2个小时,这显然是不值得的.这题就是如此. 还要注意,java && 的优先级高于||的优先级,而不是同级. pu ...

最新文章

  1. 前端工程师算法(一)
  2. 使用Hive和iReport进行大数据分析
  3. 在Centos7 更改Docker默认镜像和容器的位置
  4. 关于内存中栈和堆的区别[转]
  5. php提交表单并发送邮件,php提交表单发送邮件的方法
  6. kettle组件-应用
  7. 苹果Mac分享几个爱用音乐播放器
  8. GridView 换行设置
  9. 文件管理系统(开发文档)
  10. 金蝶k3单据编码规则_金蝶K3各单据操作步骤
  11. 2014小米校园招聘笔试(10.13北京)
  12. JAVA面向对象 从0.5到1
  13. SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口
  14. 黑马程序员---继承(下)
  15. java实现最大公约数
  16. 复制链接到剪切板php,剪切复制粘贴
  17. 青龙面板--京东试用申请
  18. 如何准确的向工程师传达动效设计?
  19. react将表格动态生成视频列表【代码】【案例】
  20. 中兴B863AV3.1-M2_卡刷固件_萌虎开机动画

热门文章

  1. windows7下载python教程-Windows 7下Python Web环境搭建图文教程
  2. python推荐书籍-有哪些 Python 经典书籍?
  3. python安装步骤图解-Python安装-小白图文教程(精)
  4. python代码大全下载-最全Python算法实现资源汇总!
  5. python做些什么-学会Python后都能做什么?网友们的回答简直不要太厉害
  6. python画二维散点图-python3怎样画二维点图
  7. python好学吗mooc中文网-Python的N种玩法_中国大学MOOC(慕课)
  8. python画曲线图例-如何使用python画曲线图
  9. python经典案例-Python递归的经典案例
  10. 流程的python-什么时候学流畅的python合适?