LeetCode | Decode Ways

原创 2016年08月29日 10:39:35

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.

开始自然想到递归解决,并且开始时理解题意有误,类似01、001这种情况不等于1,不能解码,10是正确可以解码的。

代码如下:

class Solution {
public:
    int numDecodings(string s) {
    	if(s.empty())
    		return 0;
    	int result=0;
    	getResult(&result, s, 0);
    	return result;
    }
    void getResult(int* result, string& s, int k)
    {
    	if(k == s.length())
    	{
    		(*result)++;
    		return;
    	}
    	if(s[k] != '0')
    		getResult(result, s,k+1);
    	else//0为一位数字或两位数字的第一位时,直接返回,没有结果
    		return;
    	if(k<s.length()-1)
    	{
    		if(s[k]=='1' || (s[k]=='2' && s[k+1]<='6'))
    			getResult(result, s, k+2);
    	}
    }
};

此解法随字符串的长度增长,时间复杂度成指数增长,不出意料,超时了。

正确的解法是动态规划,和“斐波那契”爬楼梯很像,只不过“一位数字”和“两位数字”都不能是以0开头。

代码如下:

class Solution {
public:
    int numDecodings(string s) {
    	if(s.empty())
    		return 0;
    	int len = s.length();
    	int* F = new int[len+1];
    	for(int i=0; i<=len; ++i)
    		F[i] = 0;
    	if(s[0] == '0')
    		return 0;
    	if(s[0] == '1' || (s[0] == '2' && s[1] <= '6'))
    		F[0] = 1;
    	if(s[1] != '0')
    		F[1] = 1;
    	for(int i=2; i<=len; ++i)
    	{
    		if(s[i-1] != '0')
    			F[i] += F[i-1];
    		if(s[i-2] == '1' || (s[i-2] == '2' && s[i-1] <= '6'))
    			F[i] += F[i-2];
    	}
    	return F[len];
    }
};


Decode Ways 把字符串解码成数字组合@LeetCode

做这道题还是有很多收获的: 1.为了避免麻烦,开数组时可以开大一些,如int[] ways = new int[len+10]; 2. 这道题实际上是和计算要几步走完台阶的那道题本质是一样的。同样要用...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月24日 05:05
  • 2743

Decode Ways 解题心得

Decode Ways 解题心得 题目描述 Decode Ways I:https://leetcode.com/problems/decode-ways/description/ ...
  • weixin_35816017
  • weixin_35816017
  • 2017年11月15日 17:49
  • 32

13.10—动态规划—Decode Ways

描述 A message containing leers from A-Z is being encoded to numbers using the following mapping: 'A'...
  • seu_nuaa_zc
  • seu_nuaa_zc
  • 2017年08月12日 12:52
  • 120

算法学习之动态规划(leetcode 91 Decode Ways)

leetcode 91. Decode Ways A message containing letters from A-Z is being encoded to numbers using th...
  • maxiaotiaoti
  • maxiaotiaoti
  • 2016年10月28日 23:59
  • 143

矩阵十大经典题目之八-hdu-2157-How many ways??

题目大意:给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=...
  • rowanhaoa
  • rowanhaoa
  • 2014年03月13日 01:00
  • 2595

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

引言 一维动态规划根据转移方程,复杂度一般有两种情况。 func(i) 只和 func(i-1)有关,时间复杂度是O(n),这种情况下空间复杂度往往可以优化为O(1) func(i)...
  • Algebra2016
  • Algebra2016
  • 2017年12月17日 20:46
  • 31

leetcode 91. Decode Ways DP动态规划 + 类似斐波那契序列 + DFS深度优先遍历

A message containing letters from A-Z is being encoded to numbers using the following mapping: ‘A’ ...
  • JackZhang_123
  • JackZhang_123
  • 2017年09月12日 12:32
  • 135

[Oracle] decode 函数及其用法

DECODE()函数,它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默...
  • oscar999
  • oscar999
  • 2014年01月17日 17:54
  • 27274

hive的UDF实现类似于oracle的decode函数功能

客户提的要求,让实现
  • zhoudetiankong
  • zhoudetiankong
  • 2014年04月22日 10:13
  • 1690

算法课第10周第3题——91. Decode Ways

题目描述: A message containing letters from A-Z is being encoded to numbers using the following m...
  • bwstardust
  • bwstardust
  • 2017年04月30日 01:30
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode | Decode Ways
举报原因:
原因补充:

(最多只允许输入30个字)