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

news2024/9/23 17:21:45

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

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

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

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

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

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

相关文章

计算机网络(一)体系结构

计算机网络体系结构 1.计算机网络概述1.1 概念1.1.1 计算机网络、互连网、互联网 1.2 组成1.3 功能1.4 分类1.5 性能指标 2.体系结构和参考模型2.1 分层结构&#xff0c;协议、接口、服务2.2 ISO/OSI参考模型和TCP/IP参考模型 1.计算机网络概述 1.1 概念 计算机网络是一个将众…

JavaSE—IO流之字符流与字节流

前言&#xff1a;按照数据的传输方向分为输入流和输出流&#xff1b;流也可以从数据编码格式上划分为字节流和字符流&#xff1b;根据封装类型不同流又分为节点流和处理流。 &#x1f4cc; 字节流 &#x1f4cc; 字节流中常用类及基本方法&#xff1a; 字节输入流 …

水泊梁山108小酒坛之小李广花荣

小李广花荣&#xff0c;是中国著名小说《水浒传》中的108将之一&#xff0c;有“百步穿杨”的功夫。在梁山泊英雄中排行第九&#xff0c;为马军八虎骑兼先锋使之首。原是清风寨副知寨&#xff0c;使一杆银枪&#xff0c;一张弓射遍天下无敌手&#xff0c;生得一双俊目&#xff…

如何使用生成式人工智能进行科学文献检索?

在学术写作过程中&#xff0c;查找文献是一个至关重要的步骤。文献检索不仅可以帮助我们了解研究领域的现状和发展&#xff0c;还可以为我们的论文提供理论支持和数据来源。然而&#xff0c;许多学者在查找文献时往往感到困惑和无所适从。本文将详细解释如何查找文献&#xff0…

java解决跨域问题

浏览器js在访问服务器中的资源时&#xff0c;会出现同一页面或者不同域名(协议&#xff0c;IP&#xff0c;端口)不可访问 例如:file://d://test.html页面(file协议)中通过ajax访问服务器api.test.com的接口(http协议)&#xff0c;由于协议不同&#xff0c;此时会出现浏览器访问…

基于数据沙箱与LLM用例自愈的UI自动化测试平台

本期作者 项目参与人员&#xff1a; 顾伊凡、陈钰广、张又中、杨雨浩、樊执政、熊梦园、何璇、谭楠 UI自动化测试能够在一定程度上确保产品质量&#xff0c;尤其在降本提效的大背景下&#xff0c;其重要性愈发凸显。理想情况下&#xff0c;UI自动化测试不仅能够能帮我们规避不少…

低功率接地故障断路器(GFI)控制芯片D4147描述

D4147主要用于三线制GFCI输出接口、GFCI芯片断路器、便携式GFCI线路等领域的产品&#xff0c;侦测并防护火线对地故障和零线对负载短路故障。 功能介绍 D4147 为低功率接地故障断路器&#xff08;GFI&#xff09;控制器芯片&#xff0c;用于检测危险的接地故障电流路径以及接地…

基于nodejs+vue文学创作的社交论坛python-flask-django-php

课题主要采用nodejs技术和MySQL数据库技术以及express框架进行开发。系统主要包括个人中心、用户管理、文章类型管理、文章信息管理、文章举报管理、警告信息管理、系统管理等功能&#xff0c;从而实现智能化的社交论坛管理方式&#xff0c;提高社交论坛管理的效率。 前端技术&…

利用Python和IP技术实现智能旅游情报系统

文章目录 引言一、系统架构设计1. 数据采集模块2. 数据处理模块3. 用户界面模块 二、数据获取技术应用三、系统功能展示四、亮数据采集工具介绍五、总结六、号外 引言 随着旅游行业的不断发展&#xff0c;人们对旅游信息的需求也越来越大。为了帮助旅行者更好地规划行程&#…

Springboot:Actuator监控

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Actuator介绍 二、集成步骤 三、重要端点介绍 1、/actuator 2、/actuator/env 3、/actuator/heapdump 4、/actuator/metrics 5、/actuator/shutdown 6、/l…

通过MobaXterm工具可视化服务器桌面

一、MobaXterm工具 MobaXterm是一款功能强大的远程连接工具&#xff0c;可以连接到各种类型的服务器&#xff0c;包括Linux、Windows和MacOS。支持多种协议&#xff0c;包括SSH、RDP、VNC和Telnet MobaXterm可以通过X11转发功能可视化服务器桌面。 二、MobaXterm工具可视化服务…

CSS中使用伪类:before来实现在标签右上角添加“推荐”等字样的斜三角样式

在HTML中添加标签并赋上类名“.recommend”即可&#xff0c;如下所示&#xff1a; <span class"recommend"></span>css中 .recommend:before {content: "推荐"; position: absolute; top: -8px; right: -26px; z-index: 1; padding: 14px 22…

【嵌入式学习】Qtday03.26

一、思维导图 二、练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_login_btn_clicked() {if(ui->…

STM32CubeIDE基础学习-USART串口通信实验(轮询方式)

STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09; 文章目录 STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09;前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写3.1 串口发送3.1.1 发…

KIOXIA铠侠CM7系列E3.S双端口NVMe2.0 PCIe5.0 SSD KCM71RJE7T68

KIOXIA 铠侠推出的CM7-R E3.S企业级NVMe读密集型企业级固态硬盘&#xff0c;采用PCIe 5.0和NVMe 2.0技术&#xff0c;性能出色&#xff0c;最高可达2,700K IOPS&#xff08;随机读取&#xff09;和310K IOPS&#xff08;随机写入&#xff09;1 DWPD的耐用性和高达15.36 TB的存储…

xmes前端问题,给form表单赋值后,再次从表单拿不到该值

xmes前端&#xff0c;给form表单赋值后&#xff0c;再次从表单拿不到该值&#xff0c;但页面可以展示 赋值 this.$[frm-main].$$([namefilm_num]).value filmNum ; 获取表单的值&#xff0c;这里拿不到之前赋的值 const reqData this.$[frm-main].serializeMyForm(); 原因&…

基于tcp协议的网络通信(将服务端守护进程化)

目录 守护进程化 引入 介绍 如何实现 思路 接口 -- setsid 注意点 实现代码 daemon.hpp log.hpp 运行情况 前情提要 -- 前后台任务介绍(区别命令),sessionsid介绍,session退出后的情况(nuhup,终端进程控制组),任务进程组概念,任务与进程组的关系,-bash介绍-CSDN博客…

深入了解服务器硬件:从基础知识到实际应用

在当今数字化的社会中&#xff0c;服务器扮演着至关重要的角色&#xff0c;它们是支撑互联网、云计算、大数据等技术发展的基石。而理解服务器硬件的基础知识对于从事IT领域的人员来说至关重要。本文将从服务器硬件的基础知识出发&#xff0c;介绍服务器硬件的组成、作用及其在…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制&#xff0c;可以为大家提供条件编译和可选依赖的高级特性&#xff0c;可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档&#xff1a;Conditional compilation - The Rust Reference features特性 Featuure 可以…

基于nodejs+vue电子产品销售系统设计与实现python-flask-django-php

该系统采用了nodejs技术、express框架&#xff0c;连接MySQL数据库&#xff0c;具有较高的信息传输速率与较强的数据处理能力。包含管理员和用户两个层级的用户角色&#xff0c;系统管理员可以对个人中心、用户管理、产品类别管理、电子产品管理、留言板管理、系统管理、订单管…