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.

分析:

方法一:

看完题目之后首先想到了用递归的方法来解决这个问题,但是对于比较长的字符串出现了TLE(超时),下面是用递归实现的代码,这种方法的思想很简单,但是很耗时。

 void getnum(string s, int &num)
{
if(s.size()== || s.size()==)
{
if(s.size()== && s[]=='')
return;
num++;
return;
} int a,b;
istringstream in1(s.substr(,));
istringstream in2(s.substr(,)); in1>>a;
in2>>b; if(a>= && a<=)
getnum(s.substr(), num); if(b>= && b<=)
getnum(s.substr(), num);
} class Solution {
public:
int numDecodings(string s) {
int num=;
getnum(s, num);
return num;
}
};

方法二:

动态规划的思想来分析题目,假设f(n)表示由给定输入的前n个字符构成的字符串所对应的解码方式个数,用a表示第n个字符所代表的数字,b表示由第n-1个字符和第n个字符所构成的二位数字,

如果a>=1 && a<=9,那么第n个字符可以单独解码,如果b>=10 && b<=26,那么第n-1个字符和第n个字符可以组合解码,以下简称a可以解码,b可以解码。考虑四种情况:

(1)a和b都可以解码,不难得出,此时,f(n)=f(n-1)+f(n-2);

(2)如果a可以解码,b不可以解码时,f(n)=f(n-1);

(3)如果a不可以解码,b可以解码时,f(n)=f(n-2);

(4)a和b都不能解码时,f(n)=0。

这种方法的运行速度很快,运行255个测试例子,耗时72ms,而用方法一耗时好几分钟。

 class Solution {
public:
int numDecodings(string s) {
if(s.size()==)
return ; int num1=, num2=;
int a,b;
istringstream in1(s.substr(,));
in1>>a;
if(a>= && a<=)
num2++;
if(s.size()==)
return num2; for(unsigned i=; i<=s.size(); i++)
{
istringstream in1(s.substr(i-,));
istringstream in2(s.substr(i-,));
in1>>a;
in2>>b;
int temp = num1;
num1 = num2;
num2 = ;
if(a>= && a<=)
num2 += num1; if(b>= && b<=)
num2 += temp;
}
return num2;
}
};

[LeetCode OJ] Decode Ways的更多相关文章

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

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

  2. 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 ...

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

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

  4. [LeetCode] 639. Decode Ways II 解码方法 II

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

  5. [LeetCode] 91. Decode Ways 解码方法

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

  6. leetcode 639 Decode Ways II

    首先回顾一下decode ways I 的做法:链接 分情况讨论 if s[i]=='*' 考虑s[i]单独decode,由于s[i]肯定不会为0,因此我们可以放心的dp+=dp1 再考虑s[i-1] ...

  7. 【leetcode】Decode Ways(medium)

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

  8. leetcode 91 Decode Ways ----- java

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

  9. [leetcode]91. Decode Ways解码方法

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

随机推荐

  1. 特性扩展:WebActivatorEx

    WebActivator: PreApplicationStartMethod 属性,用于标记作为东西您获取 Web 应用程序启动时调用的方法,在Application_Start前. PostApp ...

  2. 基于UDP协议的控制台聊天

    这几天学了java的网络编程弄出一个基于UDP协议的聊天工具 功能 添加并且备注好友(输入对方的ip) 删除好友 查看好友列表 用java写的控制台程序导出可执行程序后不能双击打开 还需要些一个脚本文 ...

  3. 7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io

    7月19日Docker&Kubernetes技术沙龙总结 - DockOne.io undefined

  4. 英文Ubantu系统安装中文输入法

    以前都是安装的中文Ubantu,但是有时候用命令行的时候中文识别不好,会出现错误,所以这次安装了英文版,但是安装后发现输入法不好用,于是就要自己安装输入法. 安装环境为Ubantu13.04 1.卸载 ...

  5. 关于64位Linux配置android开发环境出现 No such file or directory

    前几天在64位系统上部署android开发环境的时候出现了这种问题 /aapt: No such file or directory 通过谷老师,知道原理android SDK里面的程序全是32位的, ...

  6. HibernateTemplate的find(String querystring)返回值具体解释

    项目源代码中出现例如以下代码: HibernateTemplate ht =-- List<Object[]> tempList = ht.find(String querystring) ...

  7. [Webpack 2] Validate your Webpack config with webpack-validator

    It’s quite common to make a mistake while developing your webpack configuration. A simple typo can c ...

  8. iOS在xib或storyboard里为控件添加圆角、外框和外框颜色

    如果要在xib和storyboard里为控件添加圆角和外框宽度,只要这样做就可以: layer.borderWidth 设置外框宽度属性 layer.cornerRadius 设置圆角属性 只要为属性 ...

  9. android自定义控件之滚动广告条

    在一些电子商务网站上经常能够看到一些滚动的广告条,许多软件在首次使用时也有类似的广告条,如图: 其实在github上有实现这种效果的控件,不过这东西做起来也是很简单,我们今天就来看看该怎么做. 先来看 ...

  10. 构建可克隆的对象(ICloneable)

    ICloneable接口 如果想使自己的自定义类型支持向调用方返回自身同样副本的能力,需要实现标准ICloneable接口. namespace System { // // 摘要: // Suppo ...