LeetCode刷题--- 解码方法

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

 http://t.csdnimg.cn/yUl2I

【C++】    

​​​​​​http://t.csdnimg.cn/6AbpV

数据结构与算法

 ​​​http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


解码方法

题目链接:解码方法

题目

一条包含字母 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 位 的整数。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 100
  • s 只包含数字,并且可能包含前导零。

解法

题目解析

题目意思很简单

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

示例 :

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

算法原理讲解

我们这题使用动态规划,我们做这类题目可以分为以下五个步骤

  1. 状态显示
  2. 状态转移方程
  3. 初始化(防止填表时不越界)
  4. 填表顺序
  5. 返回值

1.状态表示
dp[i] 表示 :字符串中 [0 i] 区间上,⼀共有多少种编码⽅法。
2.状态转移方程
定义好状态表示,我们就可以分析 i 位置的 dp 值,如何由「前⾯」或者「后⾯」的信息推导出
来。关于 i 位置的编码状况,我们可以分为下⾯两种情况:
  • i 位置上的数单独解码成⼀个字母;
  • i 位置上的数与 i - 1 位置上的数结合,解码成⼀个字母。
下⾯我们就上面的两种解码情况,继续分析:
  1. 让 i 位置上的数单独解码成⼀个字⺟,就存在「解码成功」和「解码失败」两种情况:
    1. 解码成功:当 i 位置上的数在 [1, 9] 之间的时候,说明 i 位置上的数是可以单独解码的,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 1] 区间上的解码方法。因为 [0, i - 1] 区间上的所有解码结果,后⾯填上⼀个 i 位置解码后的字⺟就可以了。此时 dp[i] = dp[i - 1]
    2. 解码失败:当 i 位置上的数是 0 的时候,说明 i 位置上的数是不能单独解码的,那么此时 [0, i] 区间上不存在解码⽅法。因为 i 位置如果单独参与解码,但是解码失败了,那么前⾯做的努力就全部白费了。此时 dp[i] = 0
  2. i 位置上的数与 i - 1 位置上的数结合在⼀起,解码成⼀个字⺟,也存在「解码成功」和「解码失败」两种情况:
    1. 解码成功:当结合的数在 [10, 26] 之间的时候,说明 [i - 1, i] 两个位置是可以解码成功的,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 2 ] 区间上的解码方法,原因同上。此时 dp[i] = dp[i - 2]
    2. 解码失败:当结合的数在 [0, 9] [27 , 99] 之间的时候,说明两个位置结合后解码失败(这⾥⼀定要注意 00 01 02 03 04 ...... 这⼏种情况),那么此时 [0, i] 间上的解码⽅法就不存在了,原因依旧同上。此时 dp[i] = 0

综上所述: dp[i] 最终的结果应该是上⾯四种情况下,解码成功的两种的累加和(因为我们关⼼的是解码⽅法,既然解码失败,就不⽤加⼊到最终结果中去),因此可以得到状态转移⽅程dp[i] 默认初始化为 0 ):

  • s[i] 上的数在 [1, 9] 区间上时: dp[i] += dp[i - 1]
  • s[i - 1] s[i] 上的数结合后,在 [10, 26] 之间的时候: dp[i] += dp[i - 2] ;
如果上述两个判断都不成立,说明没有解码⽅法, dp[i] 就是默认值 0
3.初始化

由于可能要⽤到 i - 1 以及 i - 2 位置上的 dp 值,因此要先初始化「前两个位置」。

  1. 初始化 dp[0] 
    1. s[0] == ' 0 ' 时,没有编码⽅法,结果 dp[0] = 0 。
    2. s[0] != ' 0 ' 时,能编码成功, dp[0] = 1。
  2. 初始化 dp[1] 
    1. s[1] [19] 之间时,能单独编码,此时 dp[1] += dp[0] (原因同上, dp[1] 默认为 0 )。
    2. s[0] s[1] 结合后的数在 [10, 26] 之间时,说明在前两个字符中,⼜有⼀种编码方式,此时 dp[1] += 1。
4.填表顺序
毫⽆疑问是「从左往右」
5.返回值
应该返回 dp[n - 1] 的值,表⽰在 [0, n - 1] 区间上的编码方法。

代码实现

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n); // 创建⼀个 dp表// 初始化前两个位置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];}
};

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

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

相关文章

Spring中的依赖注入(DI)的几种方法的使用

文章目录 Spring中的依赖注入&#xff08;DI&#xff09;的几种方法的使用1、构造函数注入业务层实现类application.xml 2、set方法注入业务层实现类application.xml 3、自动注入业务层实现类application.xml 4、注入集合类型的属性业务层实现类application.xml 测试类 Spring中…

ARM CCA机密计算架构软件栈之Realm资源管理

领域资源管理的基本原则是主机保持控制。这意味着主机决定使用哪个物理内存来支持给定的领域中间物理地址&#xff08;IPA&#xff09;&#xff0c;或者存储RMM使用的Realm元数据的给定片段。 主机始终可以重新获取此物理内存&#xff0c;而无需得到领域的同意。同样&#xff…

JavaScript基本使用方法

JavaScript 是一种用于在网页上添加交互性和动态功能的脚本语言。下面是 JavaScript 的基本使用方法&#xff1a; 1.内嵌方式&#xff1a; • 在 HTML 文件中使用 <script> 标签来嵌入 JavaScript 代码。 • 可以在 <script> 标签内部编写 JavaScript 代码&#…

Leetcode算法系列| 11. 盛最多水的容器

目录 1.题目2.题解C# 解法一&#xff1a;暴力C# 解法二&#xff1a;双指针&#xff08;左指针大于右指针&#xff0c;left&#xff09;C# 解法三&#xff1a;双指针优化&#xff08;左指针小于等于最小高度&#xff0c;left&#xff09;Java 解法一&#xff1a;双指针Python3 解…

经常使用耳机对耳朵听力有影响吗?戴哪种耳机不伤耳朵听力?

经常使用耳机容易引起末梢感受器官受损&#xff0c;可能造成内耳功能损伤&#xff0c;出现耳聋、耳鸣等听力的适应性下降的症状&#xff0c;建议使用耳机时间不要过长&#xff0c;并且音量不要过大。如果想保护听力的话&#xff0c;建议选择骨传导耳机&#xff0c;骨传导耳机通…

【Delphi 基础知识 12】覆盖函数的使用

在Delphi中&#xff0c;使用关键字override可以覆盖&#xff08;override&#xff09;父类中的虚方法。以下是一个简单的覆盖函数的例子&#xff1a; unit OverrideExample;interfaceusesSysUtils;type// 父类TShape classprocedure Draw; virtual;end;// 子类TCircle class…

单片机快速入门

参考连接&#xff1a; 安装MinGW-64&#xff08;在win10上搭建C/C开发环境&#xff09;https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接&#xff1a;https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码&#xff1a;y1mz --来自百度网盘超级会员V7的分享C…

rotate-captcha-crack项目重新训练百度旋转验证码角度预测模型

参考&#xff1a; building-powerful-image-classification-models-using-very-little-data.html https://github.com/Starry-OvO/rotate-captcha-crack &#xff08;主&#xff09;作者思路&#xff1a;https://www.52pojie.cn/thread-1754224-1-1.html 纠正 新版百度、百家…

低成本总线技术——LIN总线协议规范介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 本篇文章主要介绍LIN总线协议规范。 数据帧的结构 LIN的数据帧包括报头&#xff0c;响应两大部分。而报头…

Visual Studio 2013 “即将退休”

新年快乐&#xff01; 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio&#xff0c;我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

浏览器是如何渲染页面的

浏览器是个极其复杂的程序&#xff0c;这里只是挑几个和前端息息相关的重要内容来说 在学习如何渲染之前需要知道一个浏览器浏览器会有多个进程&#xff0c;其中主要进程有浏览器进程&#xff0c;网络进程&#xff0c;渲染进程这里我们主要学习内容就发生在渲染进程。当渲染进程…

实现鼠标悬停显示书名、作者和价格的悬浮提示框功能

在开发在线书店网站的过程中&#xff0c;提供一个直观且用户友好的界面对于吸引和留住客户至关重要。其中一个能有效提升用户体验的功能是在用户将鼠标悬停在书封面上时&#xff0c;显示包含书名、作者和价格的悬浮提示框。这不仅为用户提供了即时信息&#xff0c;还增加了界面…

闭包(js的问题)

闭包的概念Closure&#xff1a;作用域 引用了自由变量的函数&#xff0c;这个被引用的自由变量将和这个函数一同存在&#xff1b; 即使已经离开了创造它的环境也不例外。 所以&#xff0c;闭包是由函数和其他相关的引用环境组合而成&#xff0c;实现信息驻留&#xff1b; 信…

如何在powershell查看.jar文件的java编译版本

整体过程 总的流程如下&#xff1a; 1. 获取.jar文件的绝对地址&#xff0c;即$JarPath $JarPath 2. 选择.jar文件任意一个类&#xff0c;即$ClassName $ClassName 3. 使用以下命令找到major字段跟着数字&#xff0c;即 javap -verbose -cp $JarPath $ClassName | S…

【解决openGauss无法使用gs_check等服务器端命令问题】

【解决openGauss无法使用gs_check等服务器端命令问题】 一、问题描述二、问题原因三、解决方法 一、问题描述 [ommopengauss03 ~]$ gs_check -i CheckCPU Parsing the check items config file successfully [GAUSS-53026]: ERROR: Execute SSH command on host 192.168.56.19…

给出一句话来描述想要的图片,就能从图库中搜出来符合要求的

介绍 地址&#xff1a;https://github.com/mazzzystar/Queryable The open-source code of Queryable, an iOS app, leverages the OpenAIs CLIP model to conduct offline searches in the Photos album. Unlike the category-based search model built into the iOS Photos…

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样&#xff0c;基于web页面实现任务调度配置与记录&#xff0c;使用简单&#xff0c;上手快速&#xff0c;其主要功能特性如下&#xff1a; 使用简单&…

如何在 Windows 上从电脑硬盘恢复照片

如今&#xff0c;随着相机设备的普及&#xff0c;您可以轻松地一次拍摄一堆照片&#xff0c;将它们传输到硬盘上&#xff0c;然后再拍摄更多照片。但是&#xff0c;如果您的所有照片意外丢失在驱动器中怎么办&#xff1f;你能恢复它们吗&#xff1f; 在本指南中&#xff0c;我…

答案解析——C语言—第3次作业—算术操作符与关系操作符

本次作业链接如下&#xff1a; C语言—第3次作业—算术操作符与关系操作符 1.在C语言中&#xff0c;表达式 7 / 2 的结果是多少&#xff1f; - A) 3.5 - B) 3 - C) 4 - D) 编译错误 答案&#xff1a;B) 3 解析&#xff1a; 在C语言中&#xff0c;当两个整数进行除法运算时&…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…