【动态规划篇】91. 解码方法

ops/2025/3/28 16:18:38/

在这里插入图片描述
在这里插入图片描述

91. 解码方法

题目链接: 91. 解码方法
题目叙述: 一条包含字母 A-Z 的消息通过以下映射进行了 编码

“1” -> ‘A’
“2” -> ‘B’

“25” -> ‘Y’
“26” -> ‘Z’
然而,在解码已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中(“2” 和 “5” 与 “25”)。

例如,11106可以映射为:

"AAJF" ,将消息分组为 (1, 1, 10, 6)
"KJF" ,将消息分组为 (11, 10, 6)
消息不能分组为 (1, 11, 06) ,因为 “06” 不是一个合法编码(只有 “6” 是合法的)。
注意,可能存在无法解码的字符串。

给你一个只含数字的 非空 字符串 s,请计算并返回 解码 方法的 总数 。如果没有合法的方式解码整个字符串,返回 0

题目数据保证答案肯定是一个 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是一个非空字符串,而不是数组,所以计算时应减去'0'
解题思路:

  1. 状态表示
    dp[i]表示:以i位置为结尾时,所有解码方法的总数
  2. 状态转移方程
    根据最近的一步,划分问题
    在这里插入图片描述
    其中a表示s[i]位置的数,b表示s[i-1]位置的数
    dp[i] = dp[i-1] + dp[i-2]
  3. 初始化
    保证填表时不越界
    0位置结尾时说明此时只解码了一个字符
    在这里插入图片描述
    1位置结尾时说明此时解码了两个字符
    在这里插入图片描述
  4. 填表顺序
    从左向右
  5. 返回值
    dp[n-1]

代码实现:

class Solution {
public:int numDecodings(string s) {//创建dp表//初始化//填表//返回值int n = s.size();vector<int> dp(n);dp[0] = s[0] != '0';//处理边界条件if (n == 1) return dp[0];if (s[0] != '0' && s[1] != '0') dp[1] += 1;//第一个位置能单独解码,并且第二个位置也能单独解码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] != '0') 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];}

细节优化:
处理边界问题以及初始化问题的技巧

  • 我们可以开一个比旧的表多1个的新的dp表,使得旧dp表下标为0的位置,映射到新的dp表下标为1的位置,旧的下标为1的位置映射到新的下标为2的位置…依次类推。
    在这里插入图片描述
  • 这样以来dp[i]就可以表示为以第i个字符为终点的解码方法的个数。所以就只需要初始化第1的字符即可。
  • 这里有个小细节,我们在初始化dp[0]这个虚拟节点时要将它初始化成1,比如只有两个字符我们要判断时 ,第二个字符单独解码时的方法数为1,第二个字符与第一个字符共同解码时的方法总数应该为2dp[2] = dp[1] + dp[0],我们可以将dp[0]给反推出来,所以dp[0]应该初始化为1
    在这里插入图片描述

代码实现:

class Solution {
public:int numDecodings(string s) {//创建dp表//初始化//填表//返回值int n = s.size();//创建dp表vector<int> dp(n+1);dp[0] = 1;dp[1] = s[0] != '0';for(int i = 2;i <= n;i++){if(s[i-1] != '0') dp[i]+=dp[i-1];int b = 10*(s[i-2]-'0') + (s[i -1] - '0');if(b>=10 && b <= 26) dp[i]+=dp[i- 2];}return dp[n];}
};

http://www.ppmy.cn/ops/167547.html

相关文章

DeDeCMS靶场攻略

文件管理器 点击模块&#xff0c;选择上传文件 在电脑中新建2.php <?php phpinfo();?> 访问2.php,验证是否成功 修改模板文件 在模块中找到index.htm 在index.htm加上<?php phpinfo();?> 点击生成->更新主页HTML,将index.html改为index.php 访问index.ph…

20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3

stty -F /dev/ttyS3 115200 -echo cat /dev/ttyS3 & echo serialdata > /dev/ttyS3 20250319在荣品的PRO-RK3566开发板的buildroot系统下使用集成的QT应用调试串口UART3 2025/3/19 14:17 缘起&#xff1a;在荣品的PRO-RK3566开发板的buildroot系统下&#xff0c;在命令…

无需编程!快速实现WinCC远程监控与报警

2. 无需编程&#xff01;快速实现WinCC远程监控与报警 痛点分析&#xff1a;企业缺乏专业编程人员&#xff0c;难以开发复杂监控系统。 解决方案&#xff1a;利用OPC560的即插即用功能&#xff0c;3步完成配置。 技术步骤&#xff1a; 连接OPC560至WinCC电脑&#xff1b; 通…

蓝桥杯 之 拔河(2024年C/C++ B组 H题)

文章目录 本题是 2024年C/C B组的H题首先看这个数据范围&#xff0c;个数也就在10^3,并且考察的还是连续区间的和的最小差值位置&#xff0c;注意的是这个区间是不能重合的 连续区间和的问题&#xff0c;考虑用到这个前缀和由于考察的是左右两个区间&#xff0c;并且还不能重合…

反反爬虫技术指南:原理、策略与合规实践

有很多人私下咨询爬虫技术&#xff0c;关于基础的爬虫技术我不打算介绍&#xff0c;因为网上有很多&#xff0c;CSDN都有非常多的介绍&#xff0c;就自行搜索。而今天要介绍主要是反-反-爬虫的技术指导与介绍。 引言 在如今的自媒体爆发时代&#xff0c;网络爬虫作为数据采集的…

防逆流检测仪表在分布式光伏发电系统中的应用

销售工程师 王孟春 13524471462 引言 目前&#xff0c;电网公司通常要求光伏并网系统为不可逆流发电系统&#xff0c;即光伏并网系统所发的电由本地负荷消耗&#xff0c;多余的电不允许通过低压配电变压器向上级电网逆向送电。在并网发电系统中&#xff0c;由于外部环境是不断…

安科瑞EMS:赋能双碳智慧园区建设,引领绿色未来

在全球气候变化加剧的背景下&#xff0c;中国提出"双碳"目标&#xff0c;彰显了大国担当。工业园区作为能源消耗和碳排放的主要载体&#xff0c;其绿色转型对实现双碳目标具有决定性意义。安科瑞电气股份有限公司推出的EMS能源管理系统&#xff0c;为工业园区提供了一…

EasyRTC嵌入式音视频通话SDK:微信生态支持、轻量化架构与跨平台兼容性(Linix/Windows/ARM/Android/iOS/LiteOS)

随着WebRTC技术的不断发展&#xff0c;实时音视频通信在各个领域的应用越来越广泛。EasyRTC嵌入式音视频通话SDK作为一款基于WebRTC技术的实时通信解决方案&#xff0c;凭借其强大的功能和灵活的集成能力&#xff0c;受到了越来越多开发者的关注。 一、系统架构设计 纯C语言开…