题目描述:

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

示例 2:

输入:s = "0"
输出:0

分析:

  因为 s[0:i] 的解码方案 可以由 s[0:i-1] 的解码方案 和 s[i] 的值推导得到

所以 可以使用动态规划算法解决。下面具体分析:

  给定 数字字符串 "1226" ,去掉最后一位得到子串 "122"  ,"122" 可解码

为 1,2,2   12,2   1,22   三种,"1226"的解码方案 是将字符 '6' 加到 "122"的所有解码方案中

对1,2,2 生成"1226"的解码序列 有两种选择,'6' 单独作一位加在后面  1,2,2,6

或 '6' 和 最后一位2拼接成  1,2,26 。由 "122"的解码方案 生成 "1226"的解码方案有

1,2,2,6   1,2,26  12,2,6  12,26   1,22,6

即可以根据 s[0:i-1] 的解码方案 和 s[i] 的值推出 s[0:i] 的解码方案。需要特别考虑 s[i-1] 和 s[i] 为 '0' 的情况。

1. 定义状态   dp[i] :s[0 : i]  的所有解码, np[i] s[0 : i]  的所有解码中,最后一个编码是1位的解码,如 对 "122"

的解码  1,2,2   12,2   1,22     dp[2] =  3 ,np[2] = 2 。

状态转移和 状态空间压缩 见下面代码和注释:

 1 class Solution {
2 public:
3 int numDecodings(string s)
4 {
5 int dp ;
6 int np ;
7 //base case
8 if(s[0] == '0'){
9 dp = 0;
10 np = 0;
11 }
12 else
13 {
14 dp = 1;
15 np = 1;
16 }
17 //state move
18 for(int i = 1;i < s.size();++i)
19 {
20 if(s[i-1] == '0')//s[0:i-1] 有效的结尾只可能是 10,20,
21 {
22 if(s[i] == '0') //‘0’ 既不能拼接在 10,20 后面,也 单独作一位
23 {
24 dp = 0;
25 np = 0;
26 }
27 //非‘0’ 可以单独作一位
28 else
29 {
30 if(dp > 0)//单独作一位跟在 ‘10’ ‘20’ 后面
31 {
32 // dp = dp;
33 np = dp;
34 }
35 else//s[0:i-1] 没有合法的解码方法
36 {
37 dp = 0;
38 np = 0;
39 }
40 }
41 }
42 else if(s[i] == '0') // s[i-1] != '0' ,s[i] == '0'
43 // s[i] == '0' 只能在 s[i-1]是 1或2 的时候与之拼接成‘10’或’20‘,不能在其他情况下拼接,也不能单独作一位
44 {
45 if(s[i-1] == '1' || s[i-1] == '2') //s[i-1]是 1或2 的时候与之拼接成‘10’或’20‘
46 {
47 dp = np;
48 np = 0;
49 }
50 else
51 {
52 dp = 0;
53 np = 0;
54 }
55 }
56 //s[i]和s[0:i-1]的所有解码序列 即可拼接又可单独作一位
57 else if(s[i-1] == '1' || (s[i-1] == '2' && s[i] >= '1' && s[i] <= '6'))
58 {
59 int temp = dp;
60 dp = dp + np;
61 np = np + (temp - np);
62 }
63 // s[i-1] 不是 0,1,2 s[i] 不是0,s[i]只能单独作一位
64 else
65 {//dp 不变 所有的s[0:i-1]的 2位结尾的解码,全部都变成 1位结尾的解码,1位结尾的解码依然是一位结尾的解码
66 // dp = dp;
67 np = dp;
68 }
69 }
70 return dp;
71 }
72 };

微软面试题: LeetCode 91. 解码方法 出现次数:3的更多相关文章

  1. Java实现 LeetCode 91 解码方法

    91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...

  2. leetcode 91. 解码方法 JAVA

    题目: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. ...

  3. leetcode 91. 解码方法

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...

  4. leetcode刷题-91解码方法

    题目 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1: ...

  5. Leetcode 639.解码方法2

    解码方法2 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 除了上述的条件以外,现在加密字符串可以包含字符 ' ...

  6. 【LeetCode】解码方法

    [问题] 一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2…'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 : 输 ...

  7. Java实现 LeetCode 639解码方法 2(递推)

    639. 解码方法 2 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 除了上述的条件以外,现在加密字符串可以 ...

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

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

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

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

随机推荐

  1. c++程序设计实践——银行系统

    银行系统 本科大二程序设计实践的作业,算是一个比较简单的项目吧,主要使用的编程范式有面向对象编程 其中引入<multimap><map>头文件实现多映射输出存取记录 引入< ...

  2. 【原创】xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(二)--实时与非实时关联(bind流程)

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 1.概述 上篇文章介绍了实时端socket创建和配置 ...

  3. CVE-2009-0927-Adobe Reader缓冲区溢出漏洞分析

    0x00概述: 此漏洞的成因是由于Adobe Reader在处理PDF文档中所包含的JavaScript脚本时的Collab对象的getlcon()方式不正确处理输入的参数,而产生的缓冲区溢出,成功利 ...

  4. selenium基础--登录简单的网站

    import time from selenium import webdriver from lxml import etree from selenium.webdriver import Act ...

  5. Ubuntu18.04中安装virtualenv和virtualenvwrapper

    1.安装virtualenv和virtualenvwrapper pip3 install virtualenv pip3 install virtualenvwrapper 2.创建目录用来存放虚拟 ...

  6. Alibaba Spring Cloud 微服务介绍(一)

    " Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件 ...

  7. Yum 命令出现[Errno 256] No more mirrors to try错误的解决方式

    今天我在虚拟机上安装 NetCore 的 SDK 的时候,出现错误,执行命令:"yum install dotnet-sdk-3.1",最后安装失败,很多安装包没有找到镜像.解决方 ...

  8. NB-IoT的NPBCH发送过程

    NB-IoT的NPBCH是使用固定的重复样式发送的.NPBCH的传输时间间隔(Transmiss Time Interval,TTI)是640ms,承载NB-IoT主系统消息块(Narrow-Band ...

  9. NB-IoT的RLC子层服务功能

    NB-IoT只支持RLC子层的确认模式(Acknowledgement Mode,AM),不支持非确认模式(Unacknowledged Mode,UM). 对于支持UP模式的UE,NB-IoT支持R ...

  10. NOIP2018 填坑记

    Oct,22ed,2018 DAY -18 又是颓废的一天呢 我好菜啊,一个圆方树弄了一整天(点双怎么那么毒瘤).(铁人两项怎么那么多点) Oct,23rd,2018 DAY -17 又双叒叕颓了一天 ...