题目描述:

一条包含字母 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. 多测师讲解自动化测试_rf节课内容_高级讲师肖sir

    *** Settings ***Library Selenium2LibraryLibrary OperatingSystem *** Variables ***${name} zhangsan@{l ...

  2. 还不会ida*算法?看完这篇或许能理解点。

    IDA* 算法分析 IDA* 本质上就是带有估价函数和迭代加深优化的dfs与,A * 相似A *的本质便是带 有估价函数的bfs,估价函数是什么呢?估价函数顾名思义,就是估计由目前状态达 到目标状态的 ...

  3. 【模拟】CF 796C Bank Hacking

    题目大意 洛谷链接 给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加1,其余点点权加2,并使最大点权最小,输出这个最小的最大点权. 其他见链接(懒). PS:原题面很不好总 ...

  4. Consul 学习笔记—服务发现

    前言: 上一篇文章简单实用Consul试下服务注册,本篇继续学习Consul中的另外特性:服务发现.KV操作 :以及对上篇文章中存在的问题进行解决 问题解决 在上一篇文章中,注册服务提示检查失败. 通 ...

  5. swoft 切面AOP尝试

    官网文档 https://www.swoft.org/documents/v2/basic-components/aop/ 视频教程 https://www.bilibili.com/video/BV ...

  6. linux wget指定下载目录和重命名

    当我们在使用wget命令下载文件时,通常会需要将文件下载到指定的目录,这时就可以使用 -P 参数来指定目录,如果指定的目录不存在,则会自动创建. 示例: p.p1 { margin: 0; font: ...

  7. html的keywords标签

    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /& ...

  8. Java中四舍五入保留两位小数

    Java中四舍五入保留两位小数 方法一 四舍五入 double f = 3.15; long res = Math.round(f); #结果 res = 3 保留两位小数 double f = 3. ...

  9. java并发编程与多线程基础学习一

    学习url:https://www.cnblogs.com/lixinjie/p/10817860.html https://www.cnblogs.com/JJJ1990/p/10496850.ht ...

  10. java数据结构-05双向链表

    一.双向链式存储: ①简述:要是节点中包含两个指针部分,一个指向前驱元,一个指向后继元,Java中LinkedList集合类的实现就是双向链表 (以下图片为网络收集,侵删) ②特点:数据是非连续的,链 ...