【LeetCode】91. 解码方法

news2024/9/28 15:20:48

91. 解码方法(中等)

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

  1. 思路

    • 这其实是一道字符串类的动态规划题,不难发现对于字符串s的某个位置i而言,我们只关心「位置 i 自己能否形成独立 item」和「位置 i 能够与上一位置(i-1)能否形成item 」,而不关心i-1 之前的位置。

    • 有了以上分析,我们可以从前往后处理字符串s,使用一个数组记录以字符串s的每一位作为结尾的解码方案数。即定义 dp[i] 为考虑前i个字符的解码方案数。将当前遍历到的字符记为 cur, 前一个字符记为 prev

    • 对于字符串 s 的任意位置 i 而言,其存在三种情况:

      • 只能由位置 i 的单独作为一个 item,转移的前提是cur > 6 && (prev != 1 || prev != 2),转移逻辑为 dp[i] = dp[i-1];
      • 只能由位置 i 的与前一位置(i-1)共同作为一个 item,这里只有两种情况,如10 / 20, 转移的前提是cur == 0 && (prev == 1 || prev == 2),转移逻辑为dp[i] = dp[i-1];
      • 位置 i 既能作为独立 item 也能与上一位置形成 item,转移的前提是cur <= 6 && (prev == 1 || prev == 2) ,转移逻辑为dp[i] = dp[i-1] + dp[i-2];
    • 当然,前导 0 的情况需要另外考虑,详见代码。

  2. 代码

    class Solution {
    public:
        int numDecodings(string s) {
            int n = s.size();
            if(n == 0 || s[0] == '0') return 0;
            if(n == 1)   return 1;
            vector dp(n+1, 1);
            int prev = s[0] - '0';
            for(int i=2; i<=n; ++i){
                int cur = s[i-1] - '0';
                if(cur == 0 && (prev == 0 || prev > 2)) return 0;
                if(prev == 1 || prev == 2 && cur < 7){
                    if(cur == 0){
                        // 10 / 20 单独考虑
                        dp[i] = dp[i-2];
                    }
                    else{
                        // 既可以单独成为一种情况 又可以和前面数字一起考虑
                        dp[i] = dp[i-1] + dp[i-2];
                    }
                }
                else{
                    // 只能单独成为一种情况
                    dp[i] = dp[i-1];
                }
                prev = cur;
            } 
            return dp[n];
        }
    };
    
  3. 收获

    • 看了题解不算难,但是要考虑到每一种情况。我一开始的想法是先分割成若干个字符串,然后判断每一个字符串所有可能的解码方式,最后累乘,但是当时没想到要逐位考虑,感觉不至于这么繁琐,果然以后想到怎么做就先试着做一下。
    • 不过,完全不需要提前分割,在遍历的过程中也就完成了分割。

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

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

相关文章

无人机测试二维码降落。

一、首先要做的就是让NX板卡驱动usb摄像头&#xff1a; 1. 下载usb_cam软件包 sudo apt install ros-melodic-usb-cam2. 启动相机节点&#xff1a; A. 查找摄像头接口 ls /dev/video*B. 在该路径下修改launch文件&#xff0c;换成你自己的摄像头接口 我这里的摄像头接口为…

PySpark基础入门(3):RDD持久化

RDD的持久化 RDD 的数据是过程数据&#xff0c;因此需要持久化存储&#xff1b; RDD之间进行相互迭代的计算&#xff0c;新的RDD的生成代表着旧的RDD的消失&#xff1b;这样的特性可以最大化地利用资源&#xff0c;老旧地RDD可以及时地从内存中清理&#xff0c;从而给后续地计…

电脑发挥极致,畅游永恒之塔sf

随着22寸显示器的普及&#xff0c;玩永恒之塔势必会对显示卡造成了很大负担。不要说效果全开&#xff0c;就连简洁的玩&#xff0c;都成了问题&#xff0c;那是不是就要重金把才买的显示卡又要拿掉呢&#xff1f; 最出众的解决办法&#xff0c;是超频。 主要就具有以下条件最佳…

Azure DevOps Server 数据还原方式三:增量还原

Contents 1. 概述2. 操作方式 2.1 创建共享文件夹&#xff0c;并将备份文件复制到共享文件夹中2.2 还原数据3 验证还原的数据库 3.1 方式一&#xff1a;核对工作项所在的表的数据3.2 方式二&#xff1a;将数据库配置到应用层&#xff0c;在应用中验证数据4. 常见问题&#xff1…

FAST协议解析1 通过输入输出逆解析

一、前言 FAST协议可以支持金融机构间高吞吐量、低延迟的数据通讯&#xff0c;目前我知道的应用领域是沪深交易所的Level-2行情传输。网络上无论是FAST协议本身&#xff0c;还是使用相关工具&#xff08;openfast、quickfast&#xff09;对FAST行情进行解析&#xff0c;相关的…

MC9S12G128开发板—解决小车九宫格方位移动功能实现遇到的一些问题

接着我的上一篇文章&#xff1a;MC9S12G128开发板—实现按键发送CAN报文指示小车移动功能。本篇文章主要记录下在实现小车九宫格方位移动功能过程中&#xff0c;遇到的一些程序问题以及解决措施。 1. 上位机小车响应开发板按键CAN报文指令的响应出错问题 问题现象描述&#x…

自动驾驶行业观察之2023上海车展-----车企发展趋势(1)

新势力发展趋势 小鹏汽车&#xff1a;发布新车G6&#xff08;中型SUV&#xff09;&#xff0c;将于2023年年中上市 发布新车G6&#xff1a;车展上&#xff0c;小鹏G6正式首发亮相&#xff0c;定位中型SUV&#xff0c;对标Tesla Model Y&#xff0c;将于2023年年中上市并开始交…

基于web的商场商城后台管理系统

该系统用户分为两类&#xff1a;普通员工和管理员。普通员工是指当前系统中的需要对商品和客户的信息进行查询的人。此类用户只能查看自己的信息&#xff0c;以及对商品和客户的信息进行查看。管理员用户可以对自己和他人的信息进行维护&#xff0c;包括对商品入库、销售、库存…

Redis缓存过期淘汰策略

文章目录 1、如何设置 Redis 最大运行内存&#xff1f;2、过期删除策略3、内存淘汰策略 1、如何设置 Redis 最大运行内存&#xff1f; 在配置文件 redis.conf 中&#xff0c;可以通过参数 maxmemory 来设定最大运行内存&#xff0c;只有在 Redis 的运行内存达到了我们设置的最…

代码命名规范

日常编码中&#xff0c;代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图&#xff0c;也是一项必备的能力。那它们有什么规律呢&#xff1f; Java项目的代码结构&#xff0c;能够体现它的设计理念。Java采用长命名的方式来规范类的命名&#xff0c;能够自己表达…

消息称苹果Type-C口充电未设MFi限制,iOS17将更新Find My服务

根据国外科技媒体 iMore 报道&#xff0c;基于消息源 analyst941 透露的信息&#xff0c;苹果公司目前并未开发 MFi 限制。 根据推文信息内容&#xff0c;两款 iPhone 15 机型的最高充电功率为 20W&#xff0c;而 iPhone 15 Pro 机型的最高支持 27W 充电。 此前古尔曼表示苹…

Python趋势外推预测模型实验完整版

趋势外推预测模型实验完整版 实验目的 通过趋势外推预测模型&#xff08;佩尔预测模型&#xff09;&#xff0c;掌握预测模型的建立和应用方法&#xff0c;了解趋势外推预测模型&#xff08;佩尔预测模型&#xff09;的基本原理 实验内容 趋势外推预测模型 实验步骤和过程…

第4章-虚拟机栈(多使用到jclasslib工具查看字节码)

虚拟机栈 简介 虚拟机栈的出现背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的【如果设计成基于寄存器的&#xff0c;耦合度高&#xff0c;性能会有所提升&#xff0c;因为可以对具体的CPU架…

警惕免杀版Gh0st木马!

https://github.com/SecurityNo1/Gh0st2023 经过调查发现&#xff0c;这款开源的高度免杀版Gh0st木马目前正在大范围传播&#xff0c;据称可免杀多种主流杀软&#xff1a;开发者不仅制作了新颖的下载页面&#xff0c;还设法增加了搜索引擎的收录权重&#xff0c;吸引了许多免…

Python基础合集 练习17(类与对象)

class Dog: pass papiDog() print(papi) print(type(papi)) 构建方法 创建类过后可以定义一个特殊的方法。在python中构建方法是__init__(),init()必须包含一个self参数 class pig(): #def__init__(self) -> None&#xff1a; print(‘你好’) pipgpig() 属性和方法 cl…

JDBC详解(六):数据库事务(超详解)

JDBC详解&#xff08;六&#xff09;&#xff1a;数据库事务&#xff08;超详解&#xff09; 前言一、数据库事务介绍二、JDBC事务处理三、事务的ACID属性1、数据库的并发问题2、四种隔离级别3、在MySql中设置隔离级别 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所…

MySQL基础——数据模型·数据库操作

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

开放原子训练营(第一季)铜锁探密:基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁&#xff08;tongsuo&#xff09;开源基础密码库实现前端对用户登录密码的加密&#xff0c;从而实现前端隐私数据的保密性。 首先&#xff0c;铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;在中国商用密码算法&#xff0c;例…

vcruntime140_1.dll无法继续执行代码怎么修复

vcruntime140_1.dll 是 Microsoft Visual C 程序集中的一个动态链接库文件。该文件提供了一些 C 运行时函数&#xff0c;这些函数是由许多应用程序使用的。当一个程序需要某个 DLL 文件时&#xff0c;它会首先在系统目录和程序所在目录中查找该 DLL 文件。如果系统或程序目录中…

《密码法》

第一章 总 则 第一条 为了规范密码应用和管理&#xff0c;促进密码事业发展&#xff0c;保障网络与信息安全&#xff0c;维护国家安全和社会公共利益&#xff0c;保护公民、法人和其他组织的合法权益&#xff0c;制定本法。 第二条 本法所称密码&#xff0c;是指采用特定变…