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 的相关文章

  • 如何调用OpenAI接口

    要调用OpenAI的接口 首先你需要在OpenAI的网站上注册一个帐号 然后去控制台里申请一个API Key 申请完之后 你就可以在你的代码里使用这个API Key来调用OpenAI的接口了 具体的方法是 使用你喜欢的编程语言 调用相应的A
  • python如何实现每月执行一次程序

    要在每月执行一次程序 xff0c 可以使用 Python 的第三方库 schedule 安装 schedule xff1a pip span class hljs keyword install span span class hljs k

随机推荐

  • 如何在中国使用openAI

    在中国使用 OpenAI 的方法与在其他国家使用 OpenAI 的方法大致相同 首先 xff0c 您可以在 OpenAI 网站上浏览有关公司及其产品的信息 xff0c 并在该网站上注册账户 接下来 xff0c 您可以使用 OpenAI 的
  • 用java写一个微信支付代码

    首先 您需要在微信支付开发平台上申请商户账号 并获取到相应的 API 密钥和商户 ID 然后 可以使用如下步骤来实现微信支付 引入微信支付所需的依赖包 创建微信支付配置类 并在其中设置 API 密钥和商户 ID 等信息 创建支付请求对象 并
  • 给我用C语言写一个二叉树的遍历

    我可以给你一个例子 xff1a include lt stdio h gt struct node int data struct node left right function to print leaf nodes of a bina
  • 如何配置vscode,使其能编写并运行urho3d的lua脚本?

    答 xff1a 要配置VSCode以编写和运行Urho3D的Lua脚本 xff0c 您需要安装Lua插件 xff0c 并在VSCode中设置Lua语言支持 您还可以为VSCode添加Urho3D相关的代码提示和自动完成功能 xff0c 以便
  • C语言课程设计 《 运动会比赛计分系统

    我可以为您提供一些建议 xff1a 1 首先了解C语言的基础语法 xff1b 2 明确比赛计分系统的功能要求 xff0c 以及实现这些功能所需的数据结构 xff1b 3 确定程序的结构 xff0c 并编写相应的函数 xff1b 4 测试程序
  • Java判断链表是否有环?

    可以使用双指针法来判断链表是否有环 具体来说 可以定义两个指针 一个指针每次移动一步 另一个指针每次移动两步 如果链表有环 那么两个指针最终一定会相遇 如果没有环 那么两个指针就会到达链表的末尾 退出循环 下面是一个示例代码 span cl
  • 使用html时如何引入module

    使用 HTML 时 可以使用 lt script gt 标签引入模块 首先 你需要在 HTML 文件中添加一个 lt script gt 标签 然后在 src 属性中指定模块的路径 例如 如果你想引入一个名为 myModule js 的模块
  • 如何使用火狐浏览器的Poster插件进行post请求

    不诗意的女程序猿不是好厨师 转载请注明出处 xff1a From 李诗雨 http blog csdn net cjm2484836553 article details 72453907 善假于物者 xff0c 正途也 学会利用身边的工具
  • c++进程间通信

    C 语言中的进程间通信方式有多种 xff0c 包括共享内存 消息队列 信号量 套接字等 共享内存是指多个进程可以访问同一块内存 xff0c 从而实现进程间的通信 共享内存的优点是速度快 xff0c 但实现较为复杂 xff0c 需要自己维护同
  • Ubuntu如何全局设置系统字体

    在 Ubuntu 系统中 xff0c 可以使用 34 gnome tweak tool 34 或 34 unity tweak tool 34 来设置全局字体 安装 34 gnome tweak tool 34 或 34 unity twe
  • re.compile()函数解析

    re compile 是 Python 中正则表达式库 re 中的一个函数 它的作用是将正则表达式的字符串形式编译为一个正则表达式对象 xff0c 这样可以提高正则匹配的效率 使用 re compile 后 xff0c 可以使用该对象的方法
  • 仓库温度湿度控制措施_一般仓库的温湿度控制范围是多少合适?

    仓库类型很多 xff0c 茶叶 冷库 医药 危险品 烟草等等 xff0c 不同库房有不同的温湿度标准 xff0c 库房必须按照规定 xff0c 将其保持在规范的恒温 恒湿状态 xff0c 才能让货物长期保存 xff0c 不变质 那一般仓库的
  • pythonplot绘图xrd_学术干货 | 手把手教你如何快速绘制XRD标准图

    如何作出如下图所示的规范XRD谱图 xff0c 是SCI论文写作的一项基本素质 今天就谈一下我个人的作图经验 xff0c 供大家参考 xff01 图1 某材料的XRD图谱 首先样品经过XRD分析仪分析后 xff0c 可以输出供Jade打开的
  • java整合webgl stl_使用WebGL实现一个Viewer来显示STL文件

    WebViewer STL varcontainer varcamera cameraTarget scene renderer varcameraType 61 1 varperspectiveAngle 61 45 varcameraP
  • 题目描述 已知字符串str。字符串str包含字符’x’,’y’。 如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。 xyyx - > yx -> 输入描述: 输入多个字符。(1<=len<...

    你好 xff0c 下面是一个使用 C 语言编写的程序 xff0c 它可以实现你所描述的字符串消除功能 xff1a include lt stdio h gt include lt string h gt int main char str
  • pcl点云边缘提取算法

    点云边缘提取算法是利用数学原理和计算机技术来提取点云数据中的边缘特征 xff0c 主要用于机器视觉和计算机图形学领域 PCL点云边缘提取算法是一种特定的点云边缘提取算法 xff0c 其主要功能是从点云数据中提取边缘特征 xff0c 以便进行
  • 在中国怎么使用tiktok

    要在中国使用 TikTok xff0c 首先需要下载它的手机应用 您可以在中国的应用商店 如苹果 App Store 或谷歌 Play 商店 中下载 TikTok 应用 安装并打开应用后 xff0c 您就可以开始使用 TikTok 了 您可
  • go 字符串数组中某个值是否存在

    可以使用 strings 包中的 Contains 函数来判断一个字符串是否存在于一个字符串数组中 以下是一个示例代码 xff1a span class hljs keyword import span span class hljs st
  • Error:代理服务器拒绝链接

    不诗意的女程序猿不是好厨师 转载请注明出处 xff1a From李诗雨 http blog csdn net cjm2484836553 article details 72593227 最近在用火狐浏览器时出现 xff1a 代理服务器拒绝
  • 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