leetcode91. 解码方法,动态规划

news/2024/9/24 4:41:47/

leetcode91__0">leetcode91. 解码方法

一条包含字母 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 只包含数字,并且可能包含前导零。

在这里插入图片描述

目录

题目分析

本题是关于字符串解码的问题。给定一个包含数字的字符串,要求计算解码的总数。解码规则如下:

  • 字符 ‘1’ 到 ‘9’ 分别对应 ‘A’ 到 ‘I’
  • 字符串 ‘10’ 到 ‘26’ 分别对应 ‘J’ 到 ‘Z’

算法选择

我们可以使用动态规划(Dynamic Programming, DP)来解决这个问题。定义一个数组 dp,其中 dp[i] 表示字符串的前 i 个字符的解码方法数。

算法步骤

  1. 初始化 dp[0]。如果第一个字符不是 ‘0’,则 dp[0] = 1;否则,返回 0。
  2. 初始化 dp[1]。根据前两个字符的值,确定 dp[1] 的值。
  3. 遍历字符串,从索引 2 开始,根据当前字符和前一个字符的值更新 dp[i]
  4. 最后返回 dp[s.size() - 1] 作为结果。

算法流程

开始
检查s0是否为0
返回0
检查s1是否为0且s0不在1和2之间
初始化dp0=1
检查s0和s1是否可以组成一个有效的解码
dp1=2
dp1=1
遍历字符串从索引2开始
检查si是否为0且si-1不在1和2之间
检查si是否不为0
dpi+=dpi-2
检查si-1和si是否可以组成一个有效的解码
继续下一轮循环
返回dps.size-1
结束

算法代码

class Solution {
public://dp[i]表示前i个字母的解码数int numDecodings(string s) {int res=0;int dp[110]={0};if(s[0]=='0') return res;if(s[1]=='0' && s[0]!='1' && s[0]!='2') return res;dp[0]=1;if(s[0]=='1'|| (s[0]=='2' && s[1]<='6' )) {dp[1]=1;if(s[1]!='0') dp[1]++;}else {dp[1]=1;}for(int i=2;i<s.size();i++)  {if(s[i]=='0' && s[i-1]!='1'&& s[i-1]!='2') {res=0;return res;}if(s[i]!='0') dp[i]+=dp[i-1];if((s[i-1]=='2'&& s[i]<='6')||(s[i-1]=='1')) dp[i]+=dp[i-2];}return dp[s.size()-1];}
};

算法分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。
  • 空间复杂度:O(n),用于存储动态规划数组。
  • 易错点:需要注意字符 ‘0’ 的处理,以及如何根据两个字符的组合更新解码方法数。

相似题目

题目链接
91. 解码方法点击访问
剑指 Offer II 097. 子序列的数目点击访问
639. 解码方法 II点击访问

http://www.ppmy.cn/news/1529650.html

相关文章

关于puppeteer项目部署到ubuntu报错记录

我的项目是nestpuppeteer的&#xff0c;但这里只记录puppeteer的问题&#xff0c;当然&#xff0c;我在windows上进行开发的时候是不出现任何问题的 部署文档 以下例子使用 ubuntu20.04&#xff0c;puppeteer & puppeteer-core 为 23.2.0/23.4.0 时间&#xff1a;2024/09…

python CRC16校验

python openmv 串口 crc16校验 class byte:def __init__(self,word):self.word wordself.low self.word & 0xffself.high self.word >> 8auchCRCHi [0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC…

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)

文章目录 内部类17.1概述17.2成员内部类17.2.1 获取成员内部类对象17.2.2 成员内部类内存图 17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述 内部类 17.1概述 写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。 如&#xff0c;A类的里面的定义B类&#x…

TCP/IP五层模型

OSI七层模型 OSI(Open Systems Interconnection)七层模型是一种概念框架&#xff0c;用于标准化不同计算机系统之间的通信过程 它由国际标准化组织(ISO)在1984年提出&#xff0c;主要用于网络通信 这七层模型从上到下分别是: 应用层(Application Layer):为应用软件提供网络服…

QT之QML从入门到精通(第四章)

Text使用 许许多多的控件都继承于此控件&#xff0c;比较重要。 import QtQuick 2.12 //2.15 import QtQuick.Window 2.12 //2.15 import QtQuick.Controls 2.12 //可以引入别的控件 import Qt.labs.folderlistmodel 2.12 import Qt.labs.platform 1.0 as Platform import Qt…

MatrixOne助力一道创新打造高性能智能制造AIOT系统

客户简介 深圳一道创新&#xff08;ETAO Innovation&#xff09;成立于2012年&#xff0c;是一家创新型软件及信息技术服务商&#xff0c;致力于制造戏份行业—电子制造业的数字转型服务&#xff0c;构建万物互联的智能工程。一道创新致力于把先进的软件系统、数字平台、人工智…

高维数据和超高维数据

在统计学中&#xff0c;高维数据和超高维数据都是指具有大量特征&#xff08;变量&#xff09;的数据集&#xff0c;但它们之间存在一些重要的联系与区别。 联系 维度概念&#xff1a;两者都涉及到数据维度的增高&#xff0c;意味着每个观测值包含许多特征。挑战&#xff1a;…

成都睿明智科技有限公司怎么样?

在这个日新月异的数字时代&#xff0c;抖音电商正以破竹之势重塑着消费市场的格局&#xff0c;成为无数商家和品牌竞相追逐的新蓝海。在这片充满机遇与挑战的浪潮中&#xff0c;成都睿明智科技有限公司犹如一颗璀璨的明星&#xff0c;凭借其专业的服务、创新的策略和敏锐的市场…