Leetcode: Decode ways

2023-05-16

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.

思路:

采用动态规划来解决,假设知道对于字符串s,从位置0解析到n-1和n-2时的解法数d[n-1]和d[n-2],那对于第n个字符就会有以下几种情况:

1.s[n]为0,且它与s[n-1]的组合是违法的,那s[n] = 0;

2.s[n]为0,但它与s[n-1]是合法组合,那s[n] = s[n-2];

3.s[n]不为0,且它与s[n-1]是合法组合,那s[n] = s[n-1] + s[n-2];

4.s[n]不为0,但它与s[n-1]的组合是违法的,那s[n] = s[n-1]


具体代码实现如下:

<pre name="code" class="cpp">class Solution {
public:
    static int numDecodings(string s) {
        if (s.empty()  || s[0] == '0')
            return 0;
        if (s.size() == 1)
            return 1;

        //第一个字符肯定是合法的数字,只有一种解法
        int preSecond = 1;
        int preOne = 0;
        if (canCompose(s[0], s[1]) && s[1] != '0')
            preOne = 2;
        else if ((canCompose(s[0], s[1]) && s[1] == '0')  //第二个字符为0,只能与第一个字符组合
            || (!canCompose(s[0], s[1]) && s[1] != '0')   //第二个字符不为0,但不能与第一个字符组合,只能分开解析
            )
            preOne = 1;
        else  //无论如何前两个字符都无解
            return 0;

        for (int i = 2; i < s.size(); ++i)
        {
            if (s[i] == '0')
            {   
                if (canCompose(s[i - 1], s[i]))
                    //情况1
                    std::swap(preOne, preSecond);
                else
                    //情况2
                    return 0;
            }                     
            else if (canCompose(s[i - 1], s[i]))
            {
                //情况3
                preOne += preSecond;
                preSecond = preOne - preSecond;
            }
            else
                //情况4
                preSecond = preOne;
        }

        return preOne;
    }

private:
   

    static bool canCompose(char chPre, char chPost)
    {
        if (chPre == 0)
            return false;
        if (chPre == '1' || (chPre == '2' && chPost <= '6'))
            return true;
        return false;
    }
};



  


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode: Decode ways 的相关文章

随机推荐

  • 球的表面积公式是怎么推导出来的?

    球的体积公式的推导 球的表面积公式是 xff1a 证明方式一 xff1a 体积求导 基本思路 xff1a 可以把半径为R的球 xff0c 从球心到球表面分成n层 xff0c 每层厚为 r n xff0c 像洋葱一样 半径获得增量是 r xf
  • Android广播实现进程间通信,很简单

    应用A发送广播 xff1a span class token keyword public span span class token keyword class span span class token class name MainA
  • 下载JDK8 JVM源码

    性子急的可以直接看快速下载步骤 xff1a 目录 详细步骤快速下载步骤 详细步骤 打开openJDK官网 xff1a https openjdk org 找到左侧的Mercurial xff0c 点击进入新界面 选择jdk8 xff0c 点
  • Git查看分支的创建人

    开发小组人多的时候 xff0c 仓库里会有跟多分支 xff0c 需要看下某个分支具体是谁创建的 命令 xff1a git for each ref format 61 39 committerdate 09 authorname 09 re
  • kotlin的this关键字几种用法

    与java不同的是 xff0c 原先MainActivity this这种写法在kotlin中会报错 如下 正确的写法有许多 xff0c 直接就写this也可以识别到 xff0c 如下 xff1a span class token clas
  • Android之ScrollView嵌套ListView解决工具

    public class Utility public void setListViewHeightBasedOnChildren ListView listView 获取ListView对应的Adapter ListAdapter lis
  • kotlin中匿名内部类的写法

    原本java开发安卓常用的setOnClickListener xff0c 用kotlin写 xff0c 也变得五花八门了 span class token keyword var span view span class token op
  • Spring与SpringMVC的区别和联系是啥?

    Spring Spring是一个开源容器框架 xff0c 可以接管web层 xff0c 业务层 xff0c dao层 xff0c 持久层的组件 xff0c 并且可以配置各种bean 和维护bean与bean之间的关系 其核心就是控制反转 I
  • “在XML文件中给代码加注释”请注意注释的位置

    先科普一下eclipse加注释的快捷键 xff1a eclipse中编辑Java文件时 xff0c 注释和取消注释的快捷键都是 xff1a 34 CTRL 43 34 编辑xml文件时 xff0c 注释 xff1a CTRL 43 SHIF
  • “无法识别的USB设备”如何解决

    昨天 xff0c 我把USB数据线插入笔记本电脑做真机调试 xff0c 电脑右下角提示显示 无法识别的USB设备 xff0c 我开始百度 xff08 还不会搭梯子用google xff09 xff0c 搜索结果大多说是要更新驱动 xff0c
  • 解决Android studio 模拟器闪烁黑屏问题

    首先 xff0c 必须感谢csdn大神给我的启示 xff0c 但是原文并没有解决我的问题 我在看 第一行代码 的时候 xff0c 跟着郭霖大神的思路 xff0c 想利用cmd命令查看虚拟机中的 db文件中的数据表 因为真机需要root才能查
  • 关于使用SDKManager刷机出现No SDKs are available for your account的解决办法

    今天刷机出现 No SDKs are available for your account 这个错误 xff0c 所以连第一步都进不去 xff08 下图是用别人的错误图 xff09 最后在GG上找到了一个解决方案 xff0c https f
  • Mac系统装android开发环境无法创建SD卡解决方案

    无法创建SD卡是小事 xff0c 但是引起的问题却是大事 xff0c 模拟器无SD卡则android项目无法正常生成R文件 xff0c 导致HelloWorld都无法跑起来 xff0c 头大 xff0c 折腾了几天 xff0c 终于找到原因
  • Matlab App Designer编译打包exe后读取文件路径问题

    首先 xff0c 标题略长 其次 xff0c 当你看到这个长长的标题并点进来的时候 xff1a bro xff0c 恭喜你终于找到了一个行之有效的解决方案 xff01 好了 xff0c 下面我们言归正传 关于MATLAB App Desig
  • Arduino程序结构,数据类型,变量

    Arduino程序结构 Arduino程序可以分为三个主要部分 xff1a 结构 xff0c 值 xff08 变量和常量 xff09 和函数 span class token keyword void span span class tok
  • 前端基础之《ECMAScript 6(6)—数组》

    一 扩展运算符 1 扩展运算符能将 数组 转换为逗号分隔的 参数序列 声明一个数组 const school 61 39 张三 39 39 李四 39 39 王五 39 用 转换成逗号分隔的序列 xff1a 39 张三 39 39 李四 3
  • linux 安装npm

    1 下载源码安装 cd wget https nodejs org dist v14 15 4 node v14 15 4 linux x64 tar xz 2 解压并放入指定目录 tar xf node v14 15 4 linux x6
  • 【安博.牛耳】嵌入式培训介绍

    培训简介 安博教育集团联手中南地区最大的IT人才输出机构 牛耳软件教育 xff0c 在湖南地区首开专业嵌入式开发工程师培训 嵌入式开发工程师专业培训课程 xff0c 由安博联合各知名企业合作伙伴的精英专家 一线项目总监 经理 优秀技术人员共
  • 最受推荐的10本C/C ++书籍

    链接 xff1a https hackr io blog 10 best c cpp books C和C 43 43 是世界上最流行的编程语言之二 C 43 43 是C语言的扩展 xff0c 这两门语言的潜力都是不可估量的 xff0c 这就
  • Leetcode: Decode ways

    A message containing letters from A Z is being encoded to numbers using the following mapping 39 A 39 gt 1 39 B 39 gt 2