【LeetCode】91. Decode Ways
题目:
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.
提示:
这道题一开始想用backtracking构造出所有可能的decoding ways,然后统计个数,但是后来发现这样的解法不论是空间复杂度还是时间复杂度以及实现的难度都不太理想,一定还有更好的解决办法,没错,那就是动态规划了。
我们可以构造一个用于dp的vector,大小为输入string长度+1。其中第[0]个元素值为1,视为边界值,然后剩下的部分可以和输入string的每个字符都一一对应起来,其含义就是到该处时有多少种decoding方法。可想而知,第一个字符只要不是'0',就一定可以翻译,因此dp[1] = 1。
那么如何构造状态转移方程呢?假设我们处理到了s[i]的位置,那么首先单个s[i]的字符是可以翻译的,如果只翻译单个s[i],那么翻译的种类有dp[i]种。若s[i-1]与s[i]构成的字符串其值是小于等于26的,那么还可以再有dp[i-1]种翻译方法。总共dp[i]+dp[i-1]种(即到s[i-2]处有多少种翻译方法,结合上s[i-1,i];以及到s[i-1]有多少种翻译方法,结合上s[i])。
如果s[i-1]与s[i]构成的字符串其值大于26,那么显然就只能和s[i-1]处的翻译方法数量一样了。
另外还有一个特殊情况,即s[i]=0,因为单个0是没有办法翻译的,也就是说此时如果按照dp[i]的翻译方式(翻译到s[i-1],之后的字符串将以0打头)是不可行的,所以要将dp[i]赋值成0。
最后,实际上每次在进行状态转移时,我们最多只需要获取前两个状态,因此这里的空间复杂度还可以进一步从O(n)缩小到O(1),这里就不进一步展开了。上代码:
代码:
class Solution {
public:
int numDecodings(string s) {
int size = s.length();
if (size <= || s[] == '') {
return ;
}
vector<int> dp(size + , );
dp[] = dp[] = ;
for (int i = ; i < size; ++i) {
if (s[i] == '') {
dp[i] = ;
}
if (s[i - ] == '' || s[i - ] <= '' && s[i] <= '') {
dp[i + ] = dp[i] + dp[i - ];
} else {
dp[i + ] = dp[i];
}
}
return dp[size];
}
};
【LeetCode】91. Decode Ways的更多相关文章
- 【LeetCode】91. Decode Ways 解题报告(Python)
[LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...
- 【LeetCode】091. Decode Ways
题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...
- 【一天一道LeetCode】#91. Decode Ways
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 A messa ...
- [leetcode DP]91. Decode Ways
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- 【LeetCode】241. Different Ways to Add Parentheses 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归构建所有表达式 方法二:分而治之 日期 ...
- 【LeetCode】241. Different Ways to Add Parentheses
Different Ways to Add Parentheses Given a string of numbers and operators, return all possible resul ...
- 【LeetCode】394. Decode String 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...
- 【leetcode】394. Decode String
题目如下: 解题思路:这种题目和四则运算,去括号的题目很类似.解法也差不多. 代码如下: class Solution(object): def decodeString(self, s): &quo ...
- leetcode@ [91] Decode Ways (Dynamic Programming)
https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...
随机推荐
- 由"永恒之蓝"病毒而来的电脑科普知识
永恒之蓝病毒事件: 继英国医院被攻击,随后在刚刚过去的5月12日晚上20点左右肆虐中国高校的WannaCry勒索事件,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并 ...
- Oracle over函数学习
sql over的作用及用法 RANK ( ) OVER ( [query_partition_clause] order_by_clause ) DENSE_RANK ( ) OVER ( [que ...
- JVM调优总结:分代垃圾回收详述
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
- XAF_GS_01_准备环境
各位久等了,接下来我们开始学习XAF入门的第一节,搭建XAF的环境 Setp 1 第一步不是创建什么项目,而是先安装我们的XAF环境也就是安装DevExpress 由于笔者安装的是16.2.3所以演示 ...
- angular控制器之间的传值
每个controller都会有自己的scope,所有的scope都是属于 $rootScope的子或者子的子... 那么问题就好解决了,通过 $rootScope.$broadcast 广播的事件每个 ...
- 关于web程序快速开发个人见解以及经历
由于在之前公司业务的发展,需要在基于核心业务的基础上开发其他较为独立的业务系统,所以就有了这个基于Dapper,DDD概念的基础框架,由于个人基于这个框架已经经历过两个系统的开发,也因为其他项目团队需 ...
- 微信小程序对医疗创业的启示,“餐饮+微信小程序”的猜想
一:微信小程序对医疗创业的启示:如何用完即走 仔细看了张小龙在28日微信公开课上发布小程序时的演讲全文,我觉得对解决当下医疗创业的困惑有着巨大的启发.没准还能开辟新的未来. 张小龙对小程序精髓的阐释是 ...
- Ultimus BPM 制药与医疗行业应用解决方案
Ultimus BPM 制药与医疗行业应用解决方案 行业应用需求 制药与医疗行业客户特点有企业总资产高.员工规模大,销售网络往往遍及全国,乃至全球市场:拥有复杂的制药生产或医疗服务组织机构,并均有严格 ...
- 开涛spring3(2.2) - IoC 容器基本原理及其helloword
2.2.1 IoC容器的概念 IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化.定位.配置应用程序中的对象及建立这些对象间的依赖.应用程序无需直接在代码中new相关的对象,应用程序由IoC ...
- web聊天室总结
前言: 最近在写一个聊天室的项目,前端写了挺多的JS(function),导致有点懵比,出了BUG,也迟迟找不到.所以昨天把写过的代码总结了一下,写成博客. 项目背景 参考博客: http://www ...