【Leetcode每日一题】 动态规划 - 解码方法(难度⭐)(43)

1. 题目解析

题目链接:91. 解码方法

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

这是一道类似斐波那契数列的题目~

当我们遇到一个类似斐波那契数列的问题时,我们通常会想到使用动态规划(DP)来求解。动态规划是一种将复杂问题分解为简单子问题,并保存子问题解以便复用的算法思想。在解码字符串的问题中,我们同样可以采用这种方法。

1. 状态定义

首先,我们需要明确问题的状态。在这里,我们定义dp[i]为字符串中从第0个字符到第i个字符这一段区间上,所有可能的解码方法的数量。这样,当我们求出dp[n](其中n是字符串的长度)时,就得到了整个字符串的解码方法数。

2. 状态转移

接下来,我们要分析dp[i]是如何从前面的状态转移过来的。考虑到第i个字符,我们有两种可能的解码方式:

  • 单独解码第i个字符:当第i个字符是'1'到'9'之间的数字时,它可以单独解码成一个字母。此时,字符串从第0个字符到第i个字符的解码方法数就等于从第0个字符到第i-1个字符的解码方法数,因为我们可以将前面所有的解码方法都加上这个单独的字符。即dp[i] += dp[i-1]
  • 与前一个字符结合解码:如果第i-1个字符和第i个字符组合起来在'10'到'26'之间(表示一个有效的两位数字),那么它们可以合并解码成一个字母。此时,字符串从第0个字符到第i个字符的解码方法数就等于从第0个字符到第i-2个字符的解码方法数,因为我们可以将前面所有的解码方法都加上这个两位数字。即dp[i] += dp[i-2]

需要注意的是,如果第i个字符是'0',那么它不能单独解码成一个字母,必须与前一个字符结合。如果结合后的数字不在'10'到'26'之间,那么这段字符串就无法解码,此时dp[i]应该保持为0。

3. 初始化

在开始计算之前,我们需要对dp数组进行初始化。由于我们的状态转移依赖于dp[i-1]dp[i-2],所以至少需要初始化前两个位置的值。

  • 对于dp[0]:如果字符串的第一个字符是'0',那么整个字符串无法解码,dp[0]应该为0;否则,至少有一种解码方法(即单独解码第一个字符),dp[0]应该为1。
  • 对于dp[1]:我们需要考虑第一个和第二个字符的组合。如果第二个字符是'1'到'9',那么它可以单独解码,此时dp[1]应该加上dp[0];如果第一个字符和第二个字符组合起来是一个有效的两位数字,那么也应该有一种解码方法,此时dp[1]应该再加1。

3.代码编写

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[0] != '0' && s[1] != '0') dp[1]++;
        int t = (s[0] - '0') * 10 + (s[1] - '0');
        if(t >= 10 && t <= 26) dp[1]++;

        for(int i = 2; i < n; i++)
        {
            if(s[i] != '0') dp[i] += dp[i - 1];
            int m = (s[i - 1] - '0') * 10 + (s[i] - '0');
            if(m >= 10 && m <= 26) dp[i] += dp[i - 2];
        }
        return dp[n - 1];
    }
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全学习路线(2024)

国家和企业越来越重视网络安全了&#xff0c;现在也有很多很厂商加招网络安全岗位&#xff0c;同时也有很多对网络安全感兴趣的朋友&#xff0c;准备转行或从事网络安全。 通常&#xff0c;网络安全的内容包括&#xff1a; 网络安全技术、网络安全管理、网络安全运作&#xff…

【MySQL数据库】数据类型和简单的增删改查

目录 数据库 MySQL的常用数据类型 1.数值类型&#xff1a; 2.字符串类型 3.日期类型 MySQL简单的增删改查 1.插入数据&#xff1a; 2.查询数据&#xff1a; 3.修改语句&#xff1a; 4.删除语句&#xff1a; 数据库 平时我们使用的操作系统都把数据存储在文件中&#…

谷歌关键词优化十招搞定提升你的存在感-华媒舍

在当今的数字化时代&#xff0c;谷歌已成为我们生活中不可或缺的一部分。作为世界上最大的搜索引擎之一&#xff0c;谷歌每天处理着海量的搜索请求。要在谷歌上获得更多的曝光和存在感&#xff0c;关键词优化是必不可少的。本文将向您介绍十招搞定谷歌关键词优化的方法&#xf…

力扣刷题44-46(力扣0062/0152/0198)

62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff0c;机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。问总共有多少条不同的路径&#xff1f; 思路&#xff1a; 其实就是问(0,0)->(m-1,n-1)一共有几条路。 第一个…

web自动化测试系列-selenium的安装和运行(一)

目录 web自动化系列之如何安装selenium 1.web自动化中的三大亮点技术 2.web自动化能解决什么问题 &#xff1f; 3.为什么是selenium ? 4.selenium特点 5.selenium安装 6.下载浏览器及驱动 7.测试代码 web自动化系列之如何安装selenium web自动化 &#xff0c;一个老生…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图&#xff1a; 由点(node&#xff0c;或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树&#xff1a;特殊的图树&#xff0c;即连通无环图树的结点从根开始&#xff0c;层层扩展子树&#xff0c;是一种层次关系&#xff0c;这种层次关系&#xff0…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

一道很有意思的题目(考初始化)

这题很有意思&#xff0c;需要你对初始化够了解才能解出来 &#xff0c;现在我们来看一下吧。 这题通过分析得出考的是初始化。关于初始化有以下知识点 &#xff08;取自继承与多态&#xff08;继承部分&#xff09;这文章中&#xff09; 所以根据上方那段知识点可知&#xf…

【linux网络(一)】初识网络, 理解四层网络模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 初识网络…

【Java程序设计】【C00361】基于Springboot的考勤管理系统(有论文)

基于Springboot的考勤管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…

RWTH-PHOENIX Weather数据集模型说明和下载

RWTH-PHOENIX Weather 2014 T数据集说明: 德国公共电视台PHOENIX在三年内(2009 年至 2011 年) 录制了配有手语翻译的每日新闻和天气预报节目,并使用注释符号转录了 386 个版本的天气预报。 此外,我们使用自动语音识别和手动清理来转录原始德语语音。因此,该语料库允许训练…

电脑控制面板在哪?5招教你快速打开!

“我在执行一个任务时要进入电脑的控制面板中查看&#xff0c;但是我不知道电脑的控制面板在哪&#xff0c;谁能帮帮我呀&#xff1f;” 电脑控制面板是一个系统文件夹&#xff0c;它提供了各种对计算机系统进行设置和管理的工具。控制面板允许用户查看并操作基本的系统设置&am…

SAP ABAP-BOPF基础训练-01简介与架构

1. 介绍-Introduction ① BOPF是什么&#xff1f;BOPF(the Business Object Processing Framework)&#xff1a;业务对象处理框架 提供了一种增量和模块化的方法&#xff0c;以符合企业面向服务体系结构(eSOA)的方式实现业务对象&#xff1b; 部分平台基础层&#xff0c;软件组…

【笔记】深入理解JVM机制

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 JVM 运⾏流程图 JVM 中内存区域划分 方法区 / 元数据区 堆 栈 程序计数器 本地方法栈 内存区域总结 JVM 中类加载过程 …

python网络爬虫实战教学——requests的使用(2)

文章目录 专栏导读1、POST请求2、响应3、Cookie设置 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生、初级数据分析工程…

【c++】类和对象(二)this指针

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本节内容来到类和对象第二篇&#xff0c;本篇文章会带领大家了解this指针 目录 1.this指针1.1this指针的引出1.2this指针的特性1.3思考题1.4C语言和C实现Stack的对…

Qt|多线程串口通信

前篇:Qt|串口通信之同步数据收一包发一包数据 文章目录 创建工程添加串口通信类添加线程类主函数运行结果需求:串口下方的一些耗时操作并不想阻塞主进程的推进; 环境:windows10+VS2017+Qt5.14.2; 写在最前: 串口不支持跨线程操作,需要写信号槽形式传递;选择COM口下发指…

Allegro之轻松绕等长

如大家所见&#xff0c;这个世界通信的速率越来越快&#xff0c;生活的节奏也在飞驰&#xff0c;如果工作还是慢条斯理&#xff0c;你将是下一个淘汰的人。 高速PCB设计避免不了的要绕等长&#xff0c;然而有时候一个单板需要绕等长的总线很多&#xff0c;一个一个的绕下去&…

独立游戏《星尘异变》UE5 C++程序开发日志3——UEC++特供的数据类型

本篇日志将介绍FString&#xff0c;FText、FName的用法和相互转换&#xff0c;以及容器TMap&#xff0c;TArray的增删查改 一、字符串相关数据类型&#xff1a;FString、FText、FName FString是最接近std::string的类型&#xff0c;字符串本身可以看做一个存储char型的动态数…

数据容器-dict以及总结-Python

师从黑马程序员 字典的定义 同样使用{},不过存储的元素是以个个的&#xff1a;键值对&#xff0c;如下语法&#xff1a; #定义字典 my_dict1{"王力宏":99,"周杰伦":88,"林俊杰":77} #定义空字典 my_dict2{} my_dict3dict() print(f"字典1…