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

问题描述:

一条包含字母 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.mzph.cn/web/8572.shtml

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

相关文章

HFSS学习-day2-T形波导的优化设计

入门实例–T形波导的内场分析和优化设计 HFSS--此实例优化设计 优化设计要求1. 定义输出变量Power31、Power21、和Power11&#xff0c;表示Port3、Port2、Port1的输出功率2.参数扫描分析添加扫描变量和输出变量进行一个小设置添加输出变量进行扫描分析 3. 优化设计&#xff0c…

卸载系统自带APP

Firefly RK3588 android 12自动多个系统软件&#xff0c;无法从UI界面进行手动删除。因此&#xff0c;考虑使用shell指令进行处理。 系统自动APP大多都安装在system/app目录下&#xff0c;且该目录多为只读。因此采用如下步骤&#xff0c; //Shell su adb shell su //重新挂载…

【Linux】线程的内核级理解详谈页表以及虚拟地址到物理地址之间的转化

一、线程的概念 对于进程来说&#xff0c;进程创建时间和空间成本较高&#xff0c;因为进程是承担分配系统资源的基本实体&#xff0c;所以线程的出现就成为了必然。Linux线程与进程非常相似&#xff0c;Linux设计者在设计之初觉得如果再为线程设计数据结构和调度算法就会使整个…

增量同步笔记

2.2.2.增量同步 全量同步需要先做RDB&#xff0c;然后将RDB文件通过网络传输个slave&#xff0c;成本太高了。因此除了第一次做全量同步&#xff0c;其它大多数时候slave与master都是做增量同步。 什么是增量同步&#xff1f;就是只更新slave与master存在差异的部分数据。如图…

kubeflow简单记录

kubeflow 13.7k star 1、Training Operator 包括PytorchJob和XGboostJob&#xff0c;支持部署pytorch的分布式训练 2、KFServing快捷的部署推理服务 3、Jupyter Notebook 基于Web的交互式工具 4、Katib做超参数优化 5、Pipeline 基于Argo Workflow提供机器学习流程的创建、编排…

JAVA系列 小白入门参考资料 接口

目录 接口 接口的概念 语法 接口使用 接口实现用例 接口特性 实现多个接口和实现用例 接口间的继承 接口 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的 USB 口&#xff0c;电源插座等。 电脑的 USB 口上&am…

【C语言】字符函数和字符串函数--超详解

前言&#xff1a; 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了 ⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 1. 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#…

C++贪心算法

关于string的系统函数&#xff01; &#xff08;注&#xff1a;以下函数只可用于string&#xff0c;不适用其他类型的变量&#xff09; ① a.size(); 这个系统函数是用来获取这个string变量的长度的&#xff0c;我们通常会新建一个变量来保存他&#xff0c;以便之后使用。 …

Spring Boot | Spring Boot 整合 “RabbitMQ“ ( 消息中间件 ) 实现

目录: Spring Boot 整合 "RabbitMQ" ( 消息中间件 )实现 &#xff1a;一、Spring Boot 整合 整合实现 : Publish/Subscribe ( 发布订阅 ) 工作模式 ( "3种"整合实现方式 )1.1 基于"API"的方式 ( 实现 Publish/Subscribe "发布订阅"工作…

使用 MobaXterm 链接 Ubuntu(Windows子系统)

MobaXterm_Personal_22.1 Ubuntu&#xff08;Windows子系统&#xff09;

难定取舍,静观其变

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

BACnet到OPC UA的楼宇自动化系统与生产执行系统(MES)整合

在智能制造的浪潮下&#xff0c;一家位于深圳的精密电子制造企业面临着前所未有的挑战&#xff1a;如何高效地将楼宇自动化系统与生产执行系统&#xff08;MES&#xff09;整合&#xff0c;实现能源管理与生产流程的精细化控制。这家企业的楼宇控制系统使用的是BACnet协议&…

Java 线程池之 ThreadPoolExecutor

Java线程池&#xff0c;特别是ThreadPoolExecutor&#xff0c;是构建高性能、可扩展应用程序的基石之一。它不仅关乎效率&#xff0c;还直接关系到资源管理与系统稳定性。想象一下&#xff0c;如果每来一个请求就创建一个新的线程&#xff0c;服务器怕是很快就要举白旗了。而Th…

【图书推荐】《图神经网络基础、模型与应用实战》

本书目的 详解PyTorch 图神经网络基础理论、模型与十多个应用案例&#xff0c;带领读者掌握图神经网络在自然语言处理、计算机视觉、推荐系统、社交网络4个领域的应用开发方法&#xff0c;丰富读者利用深度学习算法解决实际问题的能力。 本书案例 图卷积网络实现图注意力网络…

Comate,一款基于文心大模型的智能编程助手

一、官网 Baidu Comate官网 二、安装VSCode 如何下载安装VSCode 三、VSCode安装Comate 安装方式1 访问Comate官网点击 立即安装Comate插件 按钮快速安装 安装方式2 访问VSCode市场中的BaiduComate 点击 Install 按钮访问扩展详情界面 2.打开VSCode 3.安装Comate 四、…

先经营好自己,才是成事最坚实的基础!做事要稳!

电影《教父》里有句著名的台词说&#xff1a;花半秒钟就能看透事物本质的人&#xff0c;和花一辈子也看不透事物本质的人&#xff0c;注定是截然不同的命运。而这所谓的“看透本质”&#xff0c;就是事物的底层逻辑。 底层逻辑是一种解决问题的思维模式。底层逻辑越坚固&#x…

中金:如何把握不断轮动的资产“风口”

从比特币到日股&#xff0c;到黄金与铜再到当前的港股&#xff0c;每次超预期大涨后都透支回调。 今年以来资产的“风口”不断轮动&#xff0c;从比特币到日股&#xff0c;到黄金与铜&#xff0c;再到当前的港股&#xff0c;资产仿佛“接力”般交替领先&#xff0c;同时“风口”…

js api part6

正则表达式 正则表达式 &#xff08;Regular Expression&#xff09;是用于 匹配字符串中字符组合 的模式。在 JavaScript中&#xff0c;正则表达式也是对象。通常用来查找、替换那些符合正则表达式的文本&#xff0c;许多语言都支持正则表达式。 正则表达式在 JavaScript中的…

spring框架学习记录(3)

Spring事务 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功或同失败 Spring事务角色 事务管理员&#xff1a;发起事务方&#xff0c;在Spring中通常指代业务层开…

AI智能分析视频监控行业的发展趋势和市场发展浅析

监控视频AI智能分析技术的现状呈现出蓬勃发展的态势&#xff0c;这一技术源于计算机视觉和人工智能的研究&#xff0c;旨在将图像与事件描述之间建立映射关系&#xff0c;使计算机能够从视频图像中分辨出目标信息。 在技术上&#xff0c;监控视频AI智能分析技术已经实现了对视…