题目

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

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

The number of ways decoding "12" is 2.

原题链接(点我)

解题思路及代码

解码方法数量问题。

英文26个字母相应1到26,给一串数字。问翻译为字母有多少种方法?
这个题第一思路是想到使用组合排列的方法,穷举全部的可能。非常好。写出例如以下代码

class Solution {
public:int numDecodings(string s) {int count = 0;helper(0, s, count);return count;}void helper(int start, const string& s, int& count){if(start == s.size()){++count;return;}int key=0;for(int i=start; i<s.size(); ++i){if(s[start] == '0') return;key = 10*key + s[i] - '0' ;if(key>26) return;helper(i+1, s, count);}}
};

可是提交后出来的结果是超时。

再想想,使用动态规划的方法来做。

对于串s[0...i]的解码数量应该和s[0...i-1], s[0...i-2]的解码数量有关系。
dp[i]: 代表s[0...i-1]的解码数量,
dp[i] = { (s[i-1]!='0')?dp[i-1]:0 } + { s[i-2...i-1]<='26' ? dp[i-2] : 0 } ;
代码例如以下:

class Solution {
public:int numDecodings(string s) {int n = s.size();if( n<=0 || s[0]=='0') return 0;vector<int> dp(n+1, 0);dp[1] = dp[0] = 1;for(int i=2; i<=n; ++i){if(s[i-1] != '0') dp[i] = dp[i-1];if(s[i-2]=='1' || (s[i-2]=='2'&&s[i-1]<'7'))dp[i] += dp[i-2];}        return dp[n];}};

上述动态规划优化后能够仅仅使用3个变量而不是一个数组。代码例如以下:

class Solution {
public:int numDecodings(string s) {if(s.size()<=0 || s[0]=='0') return 0;int cur=0, cur_1 = 1, cur_2 = 1;for(int i=2; i<=s.size(); ++i){if(s[i-1] != '0') cur += cur_1;if(s[i-2]=='1' || (s[i-2]=='2'&&s[i-1]<'7'))cur += cur_2;cur_2 = cur_1, cur_1 = cur, cur = 0;}return cur_1;}
};

假设你认为本篇对你有收获,请帮顶。

另外,我开通了微信公众号--分享技术之美。我会不定期的分享一些我学习的东西.
你能够搜索公众号:swalge 或者扫描下方二维码关注我
(转载文章请注明出处: http://blog.csdn.net/swagle/article/details/30231807 )

[LeetCode] Decode Ways [33]相关推荐

  1. [LeetCode] Decode Ways

    (Version 0.0) Decode Ways这道题从原理上说是一个比较简单的一维DP题目,用一个一维数组的元素dp[i] (i >= 1)来记录从头开始长度为i的substring有多少种 ...

  2. [leetcode]Decode Ways

    动态规划.要注意way+=dp[i-1]或dp[i-2]以及way+=1的条件.我看有的人把数组命名为count的. public class Solution {public int numDeco ...

  3. LeetCode Decode Ways(动态规划)

    题意:编码方式为a->1,...z->26,给出编码后的数字字符串,问有多种编码方式 思路:用dp(i)表示从第1个字符到第i个字符时的编码方式,因为编码一个字符时,只能是0-9,编码两个 ...

  4. LeetCode Decode Ways

    有点意思的题目.用动态规划能够O(n)求解出来:a[i]代表子字符串string(0,i)的可能解码方式,a[i] = {a[i-1] or a[i-1]+a[i-2]}. 意思是假设string(i ...

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

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

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

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

  7. [LeetCode]91.Decode Ways

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

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

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

  9. Decode Ways leetcode java

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

  10. 91 Decode Ways

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

最新文章

  1. An internal error occurred during: Launching xxx on WebLogic10.x.
  2. Karrigell介绍
  3. java桌面应用程序打包为exe
  4. 竟然能从一维空间变换为四维空间!?
  5. mui.init方法配置
  6. docker run命令_CVE-2019-14271:Docker cp命令漏洞分析
  7. python矩阵后加点_Python Numpy和矩阵的相关面试问题
  8. poi数据导入arcgis,结合POI数据的道路自动选取方法
  9. ASP.NET核心之路微服务第01部分:构建视图
  10. Linux 下五个顶级的开源命令行 Shell
  11. 大学生动物介绍网页设计作品 dreamweaver作业静态HTML网页设计模板 保护动物网页作业制作
  12. 琵琶行用计算机弹,琵琶行中的三次弹奏
  13. python 百分号调用内置函数_打牢Python基础这12类内置函数你掌握了吗
  14. 2022款Thinkphp家政上门预约系统-全开源系统源码
  15. 前端上班第一天-开发环境配置
  16. 数据库(Mysql)----mysql建表中的约束
  17. (转)Linux系统下PDF文件的编辑
  18. 一种特殊的线性变换——正交变换
  19. Verilog语言实现设计交通灯控制器
  20. java工具类@Autowired注入失败

热门文章

  1. Linux-Anaconda-pycharm 安装 配置
  2. Axure实操笔记之axure炫酷的作者信息设置
  3. 如何提高阅读源代码的效率
  4. 通用算法(ML,DL)分类判定指标:召回率 Recall、精确度Precision、准确率Accuracy等
  5. 【HDU 1024】【线性DP】Max Sum Plus Plus
  6. Raki的统计学习方法笔记0x9章:EM算法及其推广
  7. 算法笔记-二分查找和二分答案
  8. 《Web漏洞防护》读书笔记——第2章,SQL注入防护
  9. SpringBoot下载项目中文件
  10. java的三大特征:封装,继承和多态