LeetCode-91-解码方法

news2024/11/18 11:30:54

在这里插入图片描述

1、动态规划法

我们可以使用动态规划法来解决本问题。我们利用数组 d p [ i ] dp[i] dp[i]来记录字符串前 i i i位能够组成的解码方法总数。在设计状态转移方程时,我们需要注意这样子的特殊情况:1、当 s [ i ] s[i] s[i]不为0时,单独一个 s [ i ] s[i] s[i]肯定能够被解码,故此时 d p [ i ] + = d p [ i − 1 ] dp[i]+=dp[i-1] dp[i]+=dp[i1],表示前 i − 1 i-1 i1位的解码方法可以被继承;2、当 s [ i − 1 ] s[i-1] s[i1]不为0,且 s [ i ] s[i] s[i] s [ i − 1 ] s[i-1] s[i1]构成的数字可以被解码时,当前位置还可以继承前 i − 2 i-2 i2位的解码方法,故 d p [ i ] + = d p [ i − 2 ] dp[i]+=dp[i-2] dp[i]+=dp[i2]。最终我们返回数组 d p [ i ] dp[i] dp[i]的末位即可。

class Solution {
public:
    int numDecodings(string s) {
        int length = s.size();
        vector<int> dp(length + 1);
        dp[0] = 1;
        for (int i = 1; i <= length; ++i) {
            if (s[i - 1] != '0') {
                dp[i] += dp[i - 1];
            }
            if (i >= 2 && s[i - 2] != '0' && (10 * (s[i - 2] - '0') + s[i - 1] - '0' < 27)) {
                dp[i] += dp[i - 2];
            }
        }
        return dp[length];
    }
};

2、动态规划法优化

考虑到实际上在数组 d p [ i ] dp[i] dp[i]中我们只是用到三位,故此时我们可以使用耽搁变量来代替整个数组,对算法的空间复杂度进行优化。

class Solution {
public:
    int numDecodings(string s) {
        int length = s.size(), a = 0, b = 1, c;
        for (int i = 1; i <= length; ++i) {
            c = 0;
            if (s[i - 1] != '0') {
                c += b;
            }
            if (i >= 2 && s[i - 2] != '0' && (10 * (s[i - 2] - '0') + s[i - 1] - '0' < 27)) {
                c += a;
            }
            a = b;
            b = c;
        }
        return c;
    }
};

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

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

相关文章

PID算法总结-从公式原理到参数整定解析

目录 一、控制系统 1.1控制系统的分类 1.2 性能指标 二、PID算法的起源及特点 三、PID应用 四、PID公式原理 五、PID源码 六、PID整定方法 6.1 经验法 6.2 衰减曲线法 6.3 响应曲线法 参考文献&#xff1a; 一、控制系统 1.1控制系统的分类 分为开环控制、闭环控制和复…

Axios(二)

1.axios的基本使用 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.…

前端基础_像素的处理

像素的处理 在HTML5中使用canvas API所能够做到的图像处理技术中&#xff0c;还有一个更让人惊讶的技术就是像素处理技术。使用canvas API能够获取图像中的每一个像素&#xff0c;然后得到该像素颜色的rgb值或rgba值。 使用图形上下文对象的getImageData方法来获取图像中的像…

Docker安装Nginx 反向代理服务器

前端代码扔在服务器上怎么运行&#xff0c;首先安装Nginx&#xff0c;这里我用Docker安装Nginx 文章目录一、安装nginx docker镜像1、 获取nginx官方镜像2、查看镜像库3、宿主机创建好要挂载的目录4、启动一个不挂载的容器5、配置文件挂载到宿主机6、停止/删除容器7、查看宿主机…

Kaggle手写识别-卷积神经网络Top6%-代码详解

目录 1. Introduction 简介 2. Data preparation 数据准备 2.1 Load data 加载数据 2.2 Check for null and missing values 检查空值和缺失值 2.3 Normalization 规范化 2.4 Reshape 重塑 2.5 Label encoding 标签编码 2.6 Split training and valdiation set 拆分训…

阳康,但没恢复...

这几天真的是被新冠教育了… 我是上周五就开始有症状了&#xff0c;刚开始因为看了太多小感冒、没流感厉害、几天就康复的言论&#xff0c;我以为应该很快就能好&#xff0c;再加上全过程一直没发烧还暗自窃喜&#xff1a;这玩意不过如此嘛。 没想到病毒很快教我重新做人了&a…

代码随想录训练营第15天

题目&#xff1a;二叉树的最大深度 递归法&#xff1a;后序遍历。具体思想&#xff0c; 终止条件是如果指针指向了空&#xff08;也就是此时是叶子结点&#xff09;&#xff0c;那么返回0。然后根据左右中的递归顺序去调用函数&#xff08;并且保存这次的左右子树的深度&#…

矽昌--Wireless配置简述

Wireless配置简述 1 编译 1.1 首次编译 ​ 如果是第一次编译时就需要添加wifi模块&#xff0c;请检查所需编译版型的配置&#xff0c;配置位于openwrt-18.06/target/linux/siflower/ 文件夹下&#xff0c;例如sf19a28_ac28_fullmask_def.config为ac28版型的配置。 查看配置并…

截至2022年12月共计451个信息安全国家标准汇总

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…

计网第二章.物理层

以下是湖科大计算机网络公开课的笔记&#xff1a; 1. 物理层的基本概念 物理层是解决在各种传输媒体上传输比特0和1的问题。 像用双绞线还是光纤或同轴电缆、接线器形状、尺寸、引脚数目、电压范围、某一电平的电压表示何种意义… 物理层为数据链路层屏蔽了各种传输媒体的差…

React学习32(深浅克隆之Immutable.js)

Immutable.js github地址&#xff1a;https://github.com/immutable-js/immutable-js 介绍 每次修改一个immutable对象时都会创建一个新的不可变的对象&#xff0c;在新对象上操作并不会影响到原 对象的数据&#xff0c;那Immutable这个库的实现是深拷贝还是浅拷贝&#xff…

【数据结构】优先级队列(堆)与PriorityQueue

目录 一、堆 二、Java里的集合类PriorityQueue 1、优先级队列的概念 2、构造方法 3、常用方法 1.入队offer 2.出队poll 3.获取队首元素peek 4.扩容机制 4、 注意事项 三、实现大根堆 1、准备字段 2、创建大根堆 3、offer 4、poll 5、peek 一、堆 如果有一个关键…

Selenium WebDriver定位策略(一)

WebDriver中使用的定位策略列表: 下面以百度搜索输入框为例进行讲解 1、按ID定位策略 通过元素的id属性来定位&#xff0c;前提&#xff1a;元素必须有id属性 driver.find_element_by_id("kw")2、按名称查找策略 通过元素的name属性来定位&#xff0c;前提&…

Go语言设计与实现 -- 关键字for和range

如果我们查看汇编代码的话&#xff0c;可以发现&#xff0c;经过优化的for-range循环的汇编代码和普通for的结构相同。也就是说&#xff0c;使用for-range的控制结构最终也会被Go语言编译器换成普通的for循环。 现象提出 现象1&#xff1a;循环永动机 func main() {arr : []…

如何在anaconda中配置graphviz包

文章目录GraphViz简介一&#xff1a;安装graphviz二&#xff1a;配置环境变量三&#xff1a;检测Graphviz是否配置成功。四&#xff1a;安装graphviz包GraphViz简介 graphviz是贝尔实验室开发的一个开源的工具包&#xff0c;它使用一个特定的DSL(领域特定语言):dot作为脚本语言…

android apk 目录结构

APK的目录结构 更改APK的后缀后&#xff0c;可以看到APK的组成如下&#xff1a; assets 其中assets中存放静态资源。 Res res中存放静态资源。 与assets不同之处&#xff0c;res文件夹下的所有文件会生成资源Id.lib 包括依赖的jar包库&#xff0c;so文件等。 so文件是利…

GD32F450以太网(2-2): PHY芯片IP101GR介绍

PHY芯片IP101GR 文章目录PHY芯片IP101GR1. 预备知识2. IP101GR简介3. IP101GR基于RMII接口的PCB设计重点解析3.1 时钟设置3.2. led灯设计3.3. PHY芯片地址设置4. pcb设计5. 寄存器描述6. 附加&#xff1a;IP101GR和GD32F450引脚连接情况1. 预备知识 接上文 《GD32F450以太网(…

液晶OLED接口MIPI之DSI协议学习

文章目录一、概念介绍MIPI----MIPI联盟发起的为移动应用处理器制定的开放标准MIPI-DSI---Display Serial Interface 2定义了处理器和显示模组之间的高速串行接口DCS---Display Command Set 显示命令集合&#xff08;MIPI-DSI的command模式使用通用标准命令&#xff09;DSC---Di…

字符串函数剖析(3)---strstr函数

1.strstr函数的巧妙 – 查找子字符串 1.1模拟实现strstr函数 strstr函数&#xff1a;在一个字符串中查找子串 学习新函数时&#xff0c;先去c库查找该函数的相关资料&#xff0c;更加助于你的学习 const char * strstr ( const char * str1, const char * str2 );先看函数的…

测开工具:spring boot 实现同步数据库表结构(持续更新)

一、使用场景 一个项目&#xff0c;有多套开发环境。有一套标准的数据库&#xff0c;不同的开发环境&#xff0c;有各自的一套数据库。 标准数据库的表结构经常发生变化&#xff0c;不同的开发环境中的数据库&#xff0c;需要与标准数据库的表结构保持一致。当标准数据库表结…