【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 ...
随机推荐
- 编写自己的一个简单的web容器(一)
在之前的博客中我更大家说过Http协议是对tcp协议的封装,其底层还是使用tcp协议来进行数据传出的,浏览器实际上就是一个Socket客户端,今天呢我们就开始着手利用ServerSocket来编写一个 ...
- 配置nginx脚本开机自启动
vi /etc/init.d/nginx 插入以下内容,修改红色字体自己安装路径 #!/bin/bash## chkconfig: - 85 15# description: Nginx is a W ...
- WARN Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect (org.apache.zookeeper.ClientCnxn)
[2017-05-19 13:32:14,933] INFO Waiting for keeper state SyncConnected (org.I0Itec.zkclient.ZkClient) ...
- Response.AddHeader
Response.AddHeader使用实例 1.文件下载,指定默认名 Response.AddHeader("content-type","application/x- ...
- Swift 入门之简单语法(六)
KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [Str ...
- File 常用方法
1.判断当前文件是否封装的文件夹目录 //返回true--是,false--不是 File file =new File("C:\\Users\\mac\\Desktop\\复习.txt&q ...
- nodejs服务实现反向代理,解决本地开发接口请求跨域问题
前后端分离项目需要解决第一个问题就是,前端本地开发时如何解决通过ajax请求产生的跨域的问题.一般的做法是通过本地配置nginx反向代理进行处理的,除此之外,还可以通过nodejs来进行代理接口.当然 ...
- Redis 小白指南(一)- 简介、安装、GUI 和 C# 驱动介绍
Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍 目录 简介 安装 入门指令 GUI 工具 C# 驱动介绍 简介 ANSI C 编写,开源,基于内存,可持久化,一个键值对的数据库, ...
- General Thread States
对于实践中可能出现的各种General Thread States 以下列表描述了与常规查询处理关联的线程状态值,而不是更复杂的活动,例如复制. 其中许多仅用于在服务器中查找错误. after cre ...
- Java File类应用:递归遍历文件夹和递归删除文件
要求: 1)采用递归遍历文件夹下的所有文件,包括子文件夹下的文件 2)采用递归删除文件下的所有文件 注意: 以下递归删除文件的方法,只能删除文件,所有的文件夹都还会存在 若要删除正文文件夹,可以在递归 ...