【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 ...
 
随机推荐
- jQuery选择器的优点
			
jQuery选择器的优点 相信小伙伴们对选择器并不陌生,从css1到css3的选择器有很多,但是JQuery都能完美的支持,而且API操作起来也特别方便好用,在很大程度上精简了代码,节约了很多性能.那 ...
 - [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
			
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
 - UDP协议详解
			
1.UDP协议的作用 IP协议无法区别同一个主机系统上的多个应用程序.UDP采用端口标识同一主机上的不同应用程序. 无法采取进程ID来标识不同应用程序的原因: 1)系统中应用程序的进程ID分配和销毁是 ...
 - wifi驱动总结(2)
			
1.dhd_module_init(驱动模块初始化函数) → dhd_wifi_platform_register_drv(查找设备,注册驱动) → 1) wifi_ctrlfunc_register ...
 - vue2入坑随记(一)
			
都说Vue2简单,上手容易,但小马过河,自己试了才晓得,除了ES6语法和webpack的配置让你感到陌生,重要的是思路的变换,以前随便拿全局变量和修改dom的锤子不能用了,变换到关注数据本身.vue的 ...
 - 使用IDEA部署Myeclipse项目
			
IDEA的下载和FREE注册 IDEA 下载地址:IDEA最新版本下载地址 IDEA 注册方法:注册方法 导入Myeclipse项目 IDEA主界面,选择Open,如下图所示 选择Myeclipse项 ...
 - CountDownLatch, CyclicBarrier and Semaphore
			
Reference: [1] http://shazsterblog.blogspot.co.uk/2011/12/comparison-of-countdownlatch.html CountDow ...
 - Android开发中使用static变量应该注意的问题
			
package com.highxin.launcher01; import java.util.ArrayList; import java.util.HashMap; import java.ut ...
 - CentOS7 防火墙规则 (firewalld)
			
1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disab ...
 - MySQL数据库使用mysqldump导出数据详解
			
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...