leetcode91.解码方法(动态规划)

news2025/1/16 0:47:42

问题描述:

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

'A' -> "1"
'B' -> "2"
...
'Z' -> "26"

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

  • "AAJF" ,将消息分组为 (1 1 10 6)
  • "KJF" ,将消息分组为 (11 10 6)

注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

示例一:

输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。

示例二:

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

示例三:

输入:s = "06"
输出:0
解释:"06" 无法映射到 "F" ,因为存在前导零("6" 和 "06" 并不等价)。

问题解读:

本题主要是将A~B这26个字母等价成1~26个数,然后在给你一段数字字符串,让你通过字母替代

这些数字,最后返回代替的所有的结果的个数。

问题解决:

对应使用的还是动态规划的方法:

1.状态表示

dp[i]等于以i未结尾时,所有的解码方法

2.状态转移方程

假设在i下标之前的两个元素分别是a和b,对dp[i]的结果有两种情况:

1.s[i]单独解码,满足的条件:1 <= a <= 10,对应dp[i] += dp[i - 1]

如果不满足条件,说明a == 0对应无法进行映射,直接返回0

2.s[i] 和s[i - 1]联合解码,满足的条件:10 <= 10*a + b <= 26,对应dp[i] += dp[i - 2]

如果不满足条件,说明无法用英文字母完成映射,直接跳过dp[i] 不加不减。

对应的转台转移方程需要经过判断而存在许多不同,所以这里不列出了。

3.初始化一些值:

根据上述的状态转移方程的描述,知道需要初始化dp[0]和dp[1]。

dp[0]的初始化:

只需要判断dp[0]的值是否满足 1<= dp[0] <= 9,

满足:dp[0] = 1

不满足:说明这一串数字中存在0,直接返回0

dp[1]的初始化:

需要进行两次判断,第一次判断:

需要判断dp[1]的值是否满足 1<= dp[0] <= 9,

满足:dp[1] += dp[0]

不满足:直接返回0

再判断dp[0] 和dp[1]组合是否满足 10 <= 10*dp[0] + dp[1] <= 26,

满足:dp[1] += 1

不满足:dp[1]不加不减

4.填表顺序:

从左向右

5.返回值:

dp[n - 1]

对应的代码如下:

class Solution 
{
public:
    int numDecodings(string s) 
    {
        int n = s.size();
        vector<int> dp(n);

        //初始化前两个位置
        dp[0] = s[0] != '0';
        if(n == 1)
        {
            return dp[0];
        }

        if(s[1] <= '9' && s[1] >= '1')
        {
            dp[1] += dp[0];
        }
        int t = (s[0] - '0') * 10 + s[1] - '0';
        if(t >= 10 && t <= 26)
        {
            dp[1] += 1;
        }

        //填表
        for(int i = 2;i < n;i++)
        {
            //如果单独编码
            if(s[i] <= '9' && s[i] >= '1')
            {
                dp[i] += dp[i - 1];
            }
            //如果和前面的一个数联合起来编码
            int t = (s[i - 1] - '0')* 10 + s[i] - '0';
            if(t >= 10 && t <= 26)
            {
                dp[i] += dp[i - 2];
            }
        }

        return dp[n - 1];

    }
};

大家仔细观察一下这段代码,发现这两段有很多冗余:
 

那么如何使代码更简洁呢?

我们可以将dp数组多开一个字节,这样就可以将求第二个节点的解法放在循环里面了,从而减少代

码的行数,将第一为作为虚拟头节点那么问题就来了:

1.如何确定虚拟头节点的值是结果是正确的?

我们只需设想现在在求第三个节点的解法有多少个,当第三个节点和前一个节点的组合成立的时候

需要用到虚拟头节点的数字,而此时只要将解法+1即可,所以需要再虚拟头节点存的是数字1.

2.下标的映射如何变化:

应为相当于将dp中的所有的下标都+1了,所以对应到s的映射就需要将下标-1,就是对应要得到的

数字,这不也是添加头节点的关键,不然全盘皆输,所以可以将代码修改如下:

class Solution 
{
public:
//优化后
    int numDecodings(string s) 
    {
        int n = s.size();
        vector<int> dp(n + 1);

        dp[0] = 1;
        dp[1] = s[1 - 1] != '0';

        for(int i = 2;i <= n;i++)
        {
            if(s[i - 1] != '0')
            {
                //处理单独编码的情况
                dp[i] += dp[i - 1];
            }
            int t = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
            if(t >= 10 && t <= 26)
            {
                dp[i] += dp[i - 2];
            }
        }

        return dp[n];
    }
};

这样代码就不冗余了,一定要注意s的下标的微妙变化,将所有的s[i] 都变成了s[i - 1],以此类推,

这样的代码虽然代码量下来了,但是么有任何下路上的优化,只是将初始化的值放在循环里进行了

初始化。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

难定取舍,静观其变

今&#xff08;2024年5月8日&#xff09;天&#xff0c;本“人民体验官”在推广人民日报官方微博文化产品《带着笑意的眼睛&#xff0c;能看见最美的风景》的同时&#xff0c;还要联系4月初至今期间&#xff0c;与隐藏在《麻辣论坛》幕后的那位昵称“800727”者所爆发的一连串&…

Python:一种强大的编程语言与无限可能

引言 Python是一种易于学习且功能强大的编程语言&#xff0c;它被广泛用于各种领域&#xff0c;包括数据科学、人工智能、Web开发、系统自动化等。Python以其简洁的语法、丰富的库和易于阅读的风格&#xff0c;成为了许多开发者的首选。本文将探讨Python的特性和应用&#xff…

用户下单操作

一&#xff1a;用户下单需求分析和设计&#xff1a; 用户下单业务说明&#xff1a; 在电商系统中&#xff0c;用户是通过下单的方式通知商家&#xff0c;用户已经购买了商品&#xff0c;需要商家进行备货和发货。 用户下单后会产生订单相关数据&#xff0c;订单数据需要能够体…

pytest教程-40-钩子函数-pytest_runtest_call

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_setup钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_call钩子函数的使用方法。 pytest_runtest_call 钩子函数在 pytest 调用测试函数&#xff08;即测试用…

探索 JavaScript 宇宙:DOM与BOM的星际邂逅

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;Web API&#x1f340;1 API的概念&#x1f340;2 Web API的概念…

JavaScript数字分隔符

● 如果现在我们用一个很大的数字&#xff0c;例如2300000000&#xff0c;这样真的不便于我们进行阅读&#xff0c;我们希望用千位分隔符来隔开它&#xff0c;例如230,000,000; ● 下面我们使用_当作分隔符来尝试一下 const diameter 287_266_000_000; console.log(diameter)…

xhs 旋转滑块流程分析

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 前言 之前搞过 x-s的纯…

CentOs9编译C指令报错的一种解决方案

今天使用centos9编译c代码时&#xff0c;显示bash: gcc: command not found... 下图是我的报错页面&#xff0c;依据提示信息安装gcc之后依旧显示失败 找到其中一种解决方式&#xff0c;完美解决&#xff0c;供参考 输入以下指令更新软件包列表&#xff0c;这里需要等待几分…

如何有效使用Tacotron系列语音合成模型

谷歌开发的Tacotron系列&#xff0c;主要用于文本到语音&#xff08;TTS&#xff09;的转换。模型基于端到端的序列到序列&#xff08;Seq2Seq&#xff09;架构&#xff0c;能够直接从文本中生成自然听起来的语音。Tacotron系列是基于神经网络的自回归语音合成模型&#xff0c;…

2024全国计算机专业大学排名前10强名单

根据2024软科中国大学专业排名——计算机科学与技术专业&#xff0c;全国计算机专业最好的5所大学分别是清华大学、浙江大学、北京大学、国防科技大学和北京航空航天大学等&#xff0c; 以下是上大学网&#xff08;https://www.sdaxue.com/&#xff09;整理的全国计算机专业&a…

IoTDB 入门教程 基础篇⑤——数据模型和基础概念

文章目录 一、前文二、数据模型2.1 关系型数据库MySQL。2.2 时序数据库TDengine2.3 时序数据库InfluxDB2.4 时序数据库IoTDB&#xff08;本专栏的正主&#xff09; 三、基础概念3.1 数据库&#xff08;Database&#xff09;3.2 设备模板&#xff08;元数据模板&#xff09;3.3 …

如何使用低代码快速创建一个复杂交叉报表?

前言 在当今数字化时代&#xff0c;数据是企业决策和发展的重要支柱。为了更好地理解和利用数据&#xff0c;生成清晰、全面的报表至关重要。而复杂交叉报表作为一种高级数据分析工具&#xff0c;能够帮助企业深入挖掘数据背后的价值&#xff0c;提供全面的数据概览和分析结果…

数据结构-线性表-链表-2.3-1

设计一个递归算法&#xff0c;删除不带头结点的单链表L中所有值为x的结点。 void del(Linkllist &L&#xff0c;int x){LNode *p;if(LNULL){return;}if(L->datax){pL;LL->next;;free(p);del(L,x);}else{del(L->next,x);} } 时间复杂度为O(n)

算法day01

1、[283.移动零](https://leetcode.cn/problems/move-zeroes/) 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 解题思路&#xff1a; 双指针…

重置密码之后无法ssh登录

背景描述 我这边有个服务器S&#xff0c;我从ServerA可以ssh上去&#xff0c;但是我从堡垒机B无法ssh上去&#xff1b;一开始以为是密码问题&#xff0c;手动重置密码&#xff0c;但是依然无法登录进去&#xff1b;一直提示密码错误&#xff1b;改了好几次密码都不行 问题原因…

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述&#xff1a; Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

60*13薪,外包到新疆...去吗?

大家好&#xff0c;我是白露呀。 今天我在牛客上看到一篇帖子&#xff0c;一位网友说自己收到一个 offer &#xff0c;薪资很高&#xff1a;60k*13&#xff0c;大约一年有近80万。 但是有个要求是外包到新疆的乌鲁木齐&#xff0c;他拿不定主意&#xff0c;就在牛客上发了这个…

【无标题】基于GIS、Python机器学习技术的地质灾害风险评价、易发性分析与信息化建库及灾后重建中的实践技术

理解地质灾害形成机理与成灾模式&#xff1b;从空间数据处理、信息化指标空间数据库构建、致灾因子提取&#xff0c;空间分析、危险性评价与制图分析等方面掌握GIS在灾害危险性评价中的方法&#xff1b;运用地质灾害危险性评价原理和技术方法 原文链接&#xff1a;基于GIS、Py…

GitLab使用记录

GitLab 文章目录 1. 常用命令1.1 配置邮箱 用户名1.2 查看配置1.3 基本语法 2. 连接gitlab3. 直接拉去项目 1. 常用命令 1.1 配置邮箱 用户名 git config --global user.name ShangzheChen git config --global user.email 735511377qq.com1.2 查看配置 cat ~/.gitconfig这…

学习笔记:IEEE 1003.13-2003(POSIX实时与嵌入式规范)

一、文档 在线参考&#xff1a; IEEE 1003.13-2003 免费下载Draft 版本&#xff08;pdf&#xff09;&#xff1a;IEEE Std. 1003.13 二、概念 1、POSIX标准 可移植操作系统接口&#xff08;英语&#xff1a;Portable Operating System Interface&#xff0c;缩写为POSIX&a…