原题链接: http://oj.leetcode.com/problems/decode-ways/ 

这道题要求解一个数字串依照字符串编码方式可解析方式的数量。看到这样的求数量的,我们非常easy想到动态规划来存储前面信息,然后迭代得到最后结果。

我们维护的量res[i]是表示前i个数字有多少种解析的方式,接下来来想想递归式,有两种方式:第一种新加进来的数字不然就是自己比較表示一个字符,那么解析的方式有res[i-1]种,另外一种就是新加进来的数字和前一个数字凑成一个字符,解析的方式有res[i-2]种(由于上一个字符和自己凑成了一个)。当然这里要推断前面说的两种情况是否能凑成一个字符,也就是范围的推断,假设能够才有相应的解析方式,假设不行,那么就是0。终于结果就是把这两种情况相应的解析方式相加。这里能够把范围分成几个区间:

(1)00:res[i]=0(无法解析,没有可行解析方式);

(2)10, 20:res[i]=res[i-2](仅仅有另外一种情况成立);

(3)11-19, 21-26:res[i]=res[i-1]+res[i-2](两种情况都可行);

(4)01-09, 27-99:res[i]=res[i-1](仅仅有第一种情况可行);

递推式就是依照上面的规则来得到,接下来我们仅仅要进行一遍扫描,然后依次得到维护量就能够了,算法的时间复杂度是O(n)。空间上能够看出我们每次仅仅须要前两位的历史信息,所以仅仅须要维护三个变量然后迭代赋值就能够了,所以空间复杂度是O(1)。代码例如以下:

public int numDecodings(String s) {
if(s==null || s.length()==0 || s.charAt(0)=='0')
{
return 0;
}
int num1=1;
int num2=1;
int num3=1;
for(int i=1;i<s.length();i++)
{
if(s.charAt(i)=='0')
{
if(s.charAt(i-1)=='1' || s.charAt(i-1)=='2')
num3 = num1;
else
return 0;
}
else
{
if(s.charAt(i-1)=='0' || s.charAt(i-1)>='3')
num3 = num2;
else
{
if(s.charAt(i-1)=='2' && s.charAt(i)>='7' && s.charAt(i)<='9')
num3 = num2;
else
num3 = num1+num2;
}
}
num1 = num2;
num2 = num3;
}
return num2;
}

这道题是一维动态规划的题目,递推式关系来说是比較easy得到的,主要是要对这些两位数进行划分有一些细节,easy出小错误。

Decode Ways -- LeetCode的更多相关文章

  1. Decode Ways leetcode java

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

  2. [LeetCode] Decode Ways 解码方法

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

  3. leetcode@ [91] Decode Ways (Dynamic Programming)

    https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...

  4. leetcode面试准备:Decode Ways

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

  5. [LeetCode] Decode Ways II 解码方法之二

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

  6. leetcode 91 Decode Ways I

    令dp[i]为从0到i的总方法数,那么很容易得出dp[i]=dp[i-1]+dp[i-2], 即当我们以i为结尾的时候,可以将i单独作为一个字母decode (dp[i-1]),同时也可以将i和i-1 ...

  7. 动态规划小结 - 一维动态规划 - 时间复杂度 O(n),题 [LeetCode] Jump Game,Decode Ways

    引言 一维动态规划根据转移方程,复杂度一般有两种情况. func(i) 只和 func(i-1)有关,时间复杂度是O(n),这种情况下空间复杂度往往可以优化为O(1) func(i) 和 func(1 ...

  8. LeetCode解题报告—— Word Search & Subsets II & Decode Ways

    1. Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be con ...

  9. Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)

    Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ...

随机推荐

  1. 内网DMZ外网之间的访问规则

    当规划一个拥有DMZ的网络时候,我们可以明确各个网络之间的访问关系,可以确定以下六条访问控制策略. 1.内网可以访问外网 内网的用户显然需要自由地访问外网.在这一策略中,防火墙需要进行源地址转换. 2 ...

  2. Docker入门

    -----------------------------------------Docker入门教程(一)介绍Docker入门教程(二)命令Docker入门教程(三)DockerFileDocker ...

  3. (转) 各种好用的插件 Xcode

    时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我提升编码速度和工作效率的工具 ...

  4. Swift2.0新特性

    随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都 ...

  5. EZ-USB FX2(68013)固件研究

    原始资料来自网络 整理日: 2015年2月12日 1. Welcome 算是给所有正在学习USB,还徘徊着不得其门而入的朋友一个入门的契机吧,我也深知入门的痛苦,有些人入门就是抱着那什么USB协议,包 ...

  6. 个人学习笔记--MyBatis官方推荐DAO开发方案

    1.导入Jar包 2.编写全局配置文件configuration.xml <?xml version="1.0" encoding="UTF-8" ?&g ...

  7. bzoj 1902: Zju2116 Christopher lucas定理 && 数位DP

    1902: Zju2116 Christopher Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 172  Solved: 67[Submit][Stat ...

  8. vs2010 dll生成,使用问题[good]

    VS2010 动态库开发——第一章 演练:创建和使用动态链接库 (C++) 转载自[http://www.cnblogs.com/sdlypyzq/archive/2012/01/17/2324215 ...

  9. unicode下各种类型转换CString、string

    把最近用到的各种unicode下类型转换总结了一下: 1.string转CString string a=”abc”; CString str=CString(a.c_str()); 或str.for ...

  10. oracle查询转换_view merge

    oracle对于子查询的支持做的很好,oracle optimizer会对inline view进行query transfomation,即视图合并,不过也经常带来意想不到的问题.下面是一个inli ...