动态规划算法题目练习——91.解码方法

news2024/12/23 23:26:40

1.题目解析

题目来源:91.解码方法——力扣 

测试用例 

2.算法原理

 基础版本

1.状态表示

由于题目只要求返回第i个位置的可能情况,则只需要开辟n(n=s.size())个大小的dp表即可

2.状态转移方程

题目可知第i个位置可以单独解码也可以与前一个位置组合解码,所以两种情况都需要讨论,当满足单独解码就加上前i-1个位置所有的可能性即可,当也满足与前一个位置组合解码就再加上前i-2个位置的所有可能性即可

3.初始化

需要初始化开始两个位置的值,其中dp[0]只需要判断第一个字符s[0]是否为'0'即可,为0则不能解码,dp[0]=0,反之可以解码则dp[0]=1

但是需要注意dp[1]需要判断的它本身是否可以单独解码还要判断是否可以和前一个位置组合解码

4.细节处理

需要注意这种解法不能处理n为1时的情况,需要单独处理n=1时返回dp[0]的值

5.返回值

由于只用返回第i个位置的可能性,所以映射的下标就是n-1,最后返回dp[n-1]即可

 优化版本

1.状态表示

前面的基础版本中对于第二个位置的初始化有些多余,不如只用初始化第一个dp表的位置即可,所以这里使用虚拟位置来优化

由于多了一个虚拟位置,就需要创建dp(n+1)的dp表,第一个位置用作虚拟位置,此时对应的第i个位置映射的下标也为i,更加清晰

2.状态转移方程

这里主要讲解的是对于虚拟位置的值如何确定,首先dp[1]也就是原来的dp[0],直接初始化即可,但是如果要借助状态转移方程初始化dp[2]的时候,需要用到虚拟位置的情况就是在组合解码时,,也就是dp[2] += dp[2-2]时,此时因为已经确定了dp[2-1]可以与dp[2]组合解码也就是说dp[2-1]!='0',这时将dp[0]虚拟位置置为1即可

3.初始化

简化了之后只用初始化除虚拟位置的第一个位置即可

4.细节处理

dp表多了一个虚拟位置但是s字符串没有,所以需要在基础版本的情况下将s的映射-1

5.返回值

dp表多开了一个位置,直接返回dp[n]即可

3.实战代码

初始版本 

class Solution {
public:
    int numDecodings(string s) 
    {
        int n = s.size();
        //dp表默认初始化为0 
        vector<int> dp(n);
        
        dp[0] = (s[0] != '0');
        //特殊处理边界情况
        if(n == 1)
        {
            return dp[0];
        }
        //当前两个数字都可以单独编码则加一种情况
        if(s[0] != '0' && s[1] != '0')
        {
            dp[1] += 1;
        }
        //当前两位可以组合编码则多一种情况
        int t = (s[0] - '0') * 10 + s[1] - '0';
        if(t >= 10 && t <= 26)
        {
            dp[1] += 1;
        }

        for(int i = 2;i < n;i++)
        {
            //当前位置可以单独编码
            if(s[i] != '0')
            {
                dp[i] += dp[i-1];
            }
            //当前位置可以和前一个位置组合编码
            int t = (s[i - 1] - '0') * 10 + s[i] - '0';
            if(t >= 10 && t <= 26)
            {
                dp[i] += dp[i-2];
            }
        }
        //返回第n个位置,映射下标为n-1
        return dp[n-1];
    }
};

优化版本 

class Solution {
public:
    int numDecodings(string s) 
    {
        int n = s.size();
        vector<int> dp(n+1);
        //将新加入的位置置为1
        dp[0] = 1;
        //将原来的第一个位置的初始值右移
        dp[1] = (s[1-1] != '0');

        for(int i = 2;i <= n;i++)
        {
            //当第i个位置可以单独解码则加上前i-1个位置的可能性
            //第i个位置的映射下标为i-1
            if(s[i-1] != '0')
            {
                dp[i] += dp[i - 1];
            }
            //当第i个位置可以与前一个位置组合解码则加上前i-2个位置的可能性
            //注意不能有前导0,所以t从10开始限制范围
            int t = (s[i-2] - '0')*10 + s[i-1] - '0';
            if(t >= 10 && t <= 26)
            {
                dp[i] += dp[i-2];
            }
        }
        return dp[n];
    }
};

 

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

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

相关文章

通付盾|打造新型信息基础设施

2024年9月4日&#xff0c;工业和信息化部、中央网信办等十一部门联合印发《关于推动新型信息基础设施协调发展有关事项的通知》&#xff0c;从全国统筹布局、跨区域协调、跨网络协调、跨行业协调、发展与绿色协调、发展与安全协调、跨部门政策协调等方面明确了21条具体举措&…

命名管道Linux

管道是 毫不相关的进程进程间通信::命名管道 管道 首先自己要用用户层缓冲区&#xff0c;还得把用户层缓冲区拷贝到管道里&#xff0c;&#xff08;从键盘里输入数据到用户层缓冲区里面&#xff09;&#xff0c;然后用户层缓冲区通过系统调用&#xff08;write&#xff09;写…

【JavaEE】——文件IO

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;认识文件 1&#xff1a;文件的概念 2&#xff1a;文件的结构 3&#xff1a;文件路径…

电脑好用便签怎么用,好用的便签软件让你轻松提高工作效率

在忙碌的工作中&#xff0c;作为一名牛马打工人&#xff0c;我们经常需要记住许多重要的事项和任务。有时候&#xff0c;简单的脑力记忆可能会让我们遗漏一些事情&#xff0c;而一个好用的便签软件就可以帮助我们解决这个问题&#xff0c;提高我们的工作效率。那么&#xff0c;…

四.python核心语法

目录 1.序列 1.1. 索引 1.2. 切片 1.3. 总结 2.加法和乘法 2.1. 加法 2.2. 乘法 3.常用函数 3.1.sum()函数 3.2.max()函数和min()函数 3.3.len()函数 4. list 列表 [ ] 基本操作 4.1. 列表的定义 4.2. 列表的创建&#xff08;list()函数&#xff09; 4.3. 列表的…

实施BADI增强支持多个活动的增强实施

找到一个BADI之后&#xff0c;在SE18里面输入BADI名称 一定要查看当前BADI是否支持多种用法&#xff0c;即同一个BADI定义可以实施多个BADI增强。 1、勾选多种用法&#xff0c;才能新实施BADI增强&#xff0c;支持多个实施可同时是活动的。 2、未勾选多种用法&#xff0c;只…

C++——STL简介

目录 一、什么是STL 二、STL的版本 三、STL的六大组件 没用的话..... 不知不觉两个月没写博客了&#xff0c;暑假后期因为学校的事情在忙&#xff0c;开学又在准备学校的java免修&#xff0c;再然后才继续开始学C&#xff0c;然后最近打算继续写博客沉淀一下最近学到的几周…

Echarts实现订单数据统计,前端+后端 代码

以下是静态统计图可以直接看到统计图&#xff0c;复制粘贴即可看到效果&#xff0c;但是数据是死的。下面我会介绍一种动态的方法 &#xff0c;后端动态返回&#xff0c;基于订单页面的数据&#xff0c;来渲染统计图。 Vue 安装 Echarts npm i echarts -S 静态 &#xff1a; …

粉碎玉米的机器:水滴式饲料粉碎机

水滴式饲料粉碎机的主要工作原理是利用高速旋转的锤片将饲料原料进行粉碎&#xff0c;同时将粉碎后的饲料颗粒进行搅拌和混合。这种设备结构紧凑、操作简单、维护方便&#xff0c;可以满足不同养殖场的需求。 水滴式粉碎机特点&#xff1a; 水滴式粉碎机是一款高效、多功能的机…

无人机之飞行算法篇

无人机的飞行算法是一个复杂而精细的系统&#xff0c;它涵盖了多个关键技术和算法&#xff0c;以确保无人机能够稳定、准确地执行飞行任务。 一、位置估计 无人机在空中飞行过程中需要实时获取其位置信息&#xff0c;以便进行路径规划和控制。这通常通过以下传感器实现&#…

(计算机毕设)基于Vue和Spring Boot的宠物救助网站设计与实现

博主可接毕设&#xff01;&#xff01;&#xff01; 毕业设计&#xff08;论文&#xff09; 基于Vue和Spring Boot的宠物救助网站设计与实现 摘 要 随着中国互联网的迅猛发展&#xff0c;传统宠物救助领域面临着信息管理繁琐、辐射范围有限、信息传播受限、丢失宠物找回几率较…

PAT甲级-1004 Counting Leaves

题目 题目大意 给定一棵树&#xff0c;每个节点从01到n编号&#xff0c;规定01为根节点&#xff0c;求每层叶子节点的个数。 思路 用二维数组存储树。每层叶子节点的个数&#xff0c;只能用dfs深度遍历&#xff0c;用一个数组存储所有层数的叶子节点个数。相同层数并且是叶子…

蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)

一、什么是IIC&#xff1f;24C02存储器有什么用&#xff1f; IIC &#xff08;IIC 是半双工通信总线。半双工意味着数据在某一时刻只能沿一个方向传输&#xff0c;即发送数据的时候不能接收数据&#xff0c;接收数据的时候不能发送数据&#xff09;即集成电路总线&#xff08;…

力扣hot100--链表

链表 1. 2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff…

不知道是你的损失,盘点8个可能被忽略的极空间宝藏功能与使用技巧

不知道是你的损失&#xff0c;盘点8个可能被忽略的极空间宝藏功能与使用技巧 哈喽小伙伴们好&#xff0c;我是Stark-C~ 极空间作为后起之秀的新势力NAS&#xff0c;它的产品不管是做工、性能、用户体验等方面都表现非常出色&#xff0c;它独家搭载的ZOS系统不管是功能性还是可…

计算机毕业设计 基于Python的食品销售数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 数据分析 Vue【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

easyconnect配置wireshark抓包

文章目录 概述过程配置Wireshark抓包 概述 过程 配置Wireshark抓包 首先需要配置虚拟网卡SangforVPN可被Wireshark识别 重启 sc stop npcap sc start npcap# 清空路由表 netsh int ipv4 reset # 查看路由表 route print

自动化测试 | XPath的使用和CSS选择器的使用

XPath的使用 1.在谷歌浏览器中&#xff0c;按F12后&#xff0c;点击Elements。然后按CtrlF&#xff0c;出现搜索框&#xff0c;输入定位字符串后&#xff0c;会提示与定位字符串匹配的元素。 小技巧&#xff1a; 在谷歌浏览器里面可以点中你选择的元素标签&#xff0c;然后右…

反向旅游、住国宾馆,这届年轻人变了

“假期怎么过那么快啊&#xff0c;一转眼就没有了。”Cloe在群里疯狂地吐槽着。“刚从景点回来&#xff0c;还没缓缓呢&#xff0c;就要开始上班了。” 旅游已然成为了现在每个假期的必备课题。 据携程发布的《2024年国庆旅游消费报告》显示&#xff0c;国庆假期&#xff0c;…

Chromium 如何查找前端 Browser, Screen等对象定义在c++中的实现

以前端Navigator 对象为例&#xff1a; 1、直接在vscode里面搜索"Navigator" 过滤条件*.idl&#xff0c;这样可以搜到Navigator.idl对象文件。 2、打开Navigator.idl 可以看到平级目录对应的Navigator.h 和Navigator.cc定义 3、Navigator.idl会在out\Debug\gen\thir…