C++笔试练习笔记【7】:力扣 91. 解码方法 动态规划练习
文章目录
- 题目
- 题目分析
- 思路
- 解法
- 正常解法
- 优化解法
题目
题目链接:力扣 91. 解码方法
备用链接:https://leetcode.cn/problems/decode-ways/description/


题目分析
1.首先我们知道题目给定A~Z编码为1 ~26 ,而数字十一字符串的形式给出所以需要转换成整型
2.在解码部分我们可以了解到分为两种可能
(1)单独一个数字能否解码,如图:

(2)两个数字能否解码,如图:

3.返回是解法的总数
4.字符串s的范围在1 ~ 100之间
5.字符串s 只包含数字,并且可能包含前导零
思路
首先我们想到用动态规划的解法
那么进入动态规划几个基本步骤:
1. 确定dp状态表示什么
一般来说在dp问题中都是以i位置为起点表示什么什么或者以i位置为结尾表示什么什么…
那么我们就想一下这道题是正常给的字符串s我们解码的时候从左向右解码所以我们就这样来确定
dp[i]:以i为结尾时,解码方法的总数
2. 状态转移方程的表示
我们可以分为两种情况如图:

解读:
- 单独解码的时候只有数字在1 ~ 9 之间才有对应字母,即解码成功
- 单独解码时候一个字母解码成功不代表全解码成功,而我们dp[i]的意思是以i为结尾时,解码方法的总数,那么之后到达最后一个字符s[i]也解码成功才算一种方法,所以相较于i-1的解码只是在后面又加了一个字符进行判断能否成功解码,所以成功也还是dp[i-1]
- 解码失败那么前面的解码都白费所以就不加 dp[i-1]这种方法
- 组合解码数字在10 ~ 26而不是0 ~ 26是防止==“06”/“01”==等这种情况
- 最后dp[i]的状态转移方程
- 就是
dp[i]=if(1 ~ 9 ){dp[i-1]}+if(10 ~ 26){dp[i-2]}如果单独解码成功则加dp[i-1]如果组合解码成功就加dp[i-2]
3. 初始化
因为我们会用到 i -1 和 i - 2 所以我们初始化的时候要初始化dp[0]和dp[1]两个

4. 填表方向
我们要先知道dp[i-2],dp[i-1]才能推出dp[i],所以方向是从左向右
5. 返回值
返回dp[size-1],给定字符串的最后一项
解法
正常解法
class Solution {
public:int numDecodings(string s) {int size=s.size();int dp[110]={0};int num10=0,num1=0,num=0;if(s[0]!='0') dp[0]=1;if(size==1) return dp[0];//如果字符串s中只有一个字符那个只有一种情况直接返回if(s[1]!='0'&&s[0]!='0') dp[1]+=1;num10=s[0]-'0',num1=s[1]-'0',num=num10*10+num1;//i-1作为十位,i作为个位if(num>=10&&num<=26) dp[1]+=1;for(int i=2;i<size;i++){if(s[i]!='0') dp[i]+=dp[i-1];//解码成功加dp[i-1]num10=s[i-1]-'0',num1=s[i]-'0',num=num10*10+num1;if(num>=10&&num<=26) dp[i]+=dp[i-2];//解码成功加dp[i-2]}return dp[size-1];//返回最后一个总数减一}
};
优化解法
在上面的代码中我们初始化和正常的填表操作有很大的重复所以我们改进一下

我们人为添加一个dp[0]的虚拟位,其余位依次向下挪一位,这样在填表的操作中就能实现从第二位开始填表
这种方法的注意事项:
- 下标的映射关系
我们在多加了一个虚拟下标之后就等于dp的位多了一位所以我们在获取s的时候要s[i-1]才能获取到对应dp[i]的s的值。
- 人为填写的值要正确(一般情况下都是0,本题就要计算下)
我们填写的时候dp[2]=dp[1]+dp[0],dp[1]是不会出错的,dp[2]我们又能直接算出来,所以dp[0]我们就可以直接得到,本题dp[0]要填1。
class Solution {
public:int numDecodings(string s) {int size=s.size();int dp[110]={0};int num10=0,num1=0,num=0;dp[0]=1;if(s[1-1]!='0') dp[1]=1;if(size==1) return dp[1];for(int i=2;i<=size;i++){if(s[i-1]!='0') dp[i]+=dp[i-1];num10=s[i-1-1]-'0',num1=s[i-1]-'0',num=num10*10+num1;if(num>=10&&num<=26) dp[i]+=dp[i-2];}return dp[size];}
};
相关文章:
C++笔试练习笔记【7】:力扣 91. 解码方法 动态规划练习
文章目录 题目题目分析思路解法正常解法优化解法 题目 题目链接:力扣 91. 解码方法 备用链接:https://leetcode.cn/problems/decode-ways/description/ 题目分析 1.首先我们知道题目给定A~Z编码为1 ~26 ,而数字十一字符串的形式给出所以…...
【antd】antd3的表单校验不提示报错信息
描述 不是网上所谓的自定义校验方法的问题。 今天在写一个antd3的业务的时候,封装一个组件,把校验和请求事件放在一个方法里面,用回调或者promise进行异步处理。 发现原因是在校验错误的判断,进行callback之后,页面…...
Game AI ——游戏人工智能(逻辑及剧情生成)
一、Game AI 的介绍 "Game AI"(游戏人工智能)通常指的是在电子游戏中使用的各种人工智能技术和算法,用于控制游戏中的非玩家角色(NPC)、敌人、队友等,以及为玩家提供有挑战性的对手或有趣的互动…...
算法基础知识——核函数
简介:个人学习分享,如有错误,欢迎批评指正 核函数(Kernel Function)是机器学习中一种重要的工具,特别是在支持向量机(SVM)、核岭回归、核主成分分析(KPCA)等核…...
安卓xml乱码/加密转换:abx2xml和xml2abx使用及源码介绍
背景: 上一篇文章 android系统中data下的xml乱码无法查看问题剖析及解决方法 发布后,想要寻找一个可以直接把二进制xml和普通xml进行相互转换的,当时还写了相关的方案,但是当时没有找到现成的开源工具,后来经过相关粉…...
slice 截取
JavaScript中的一个数组方法。然而,在Vue 3的应用开发中,slice 方法经常被用于处理数组数据,特别是在需要实现分页、数据截取或数据展示等场景时。 slice 方法的基本用法 slice() 方法返回一个新的数组对象,这一对象是一个由 be…...
XReparentWindow踩坑分析
X11是Linux发行系统中广泛采用的显示协议,各个系统基本上都支持XLib库,作为底层接口,XReparentWindow接口的功能就是重新设置父窗口,注意这个可以跨进程设置父窗口,例如将已经运行的进程的父窗口设置自己的程序Wid&…...
OpenAI动荡,将走向何方、GPT5或许将近、毒舌AI轻松破防网友、最新版 GPT-4o AI 模型得满分 | AGI视界周刊第 4 期
AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...
RCE---无字母数字webshell
<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析代码:传参不大于35&…...
有意思的漏洞复现与分析一
目录 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况,去掉字符 串尾的\0,限制在7个字符。 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况&a…...
力扣题解(按身高排序)
2418. 按身高排序 给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 思路&…...
Redis的六种淘汰策略详解
Redis作为一种高性能的键值对存储系统,其数据全部存储在内存中,因此内存管理对Redis的性能至关重要。当Redis的内存使用达到上限时,就需要通过淘汰策略来释放内存空间,以便存储新的数据。Redis提供了六种不同的淘汰策略࿰…...
vue3中 ref 和 reactive 的区别
相同:均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同:ref用于包装JavaScript基本类型的数据(如字符串、数字、布尔值等),而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…...
《单例模式的深度解读:实现方式、破坏情况与利弊权衡》
单例模式 一、单例模式的定义 单例模式(Singleton Pattern)是一种常见的软件设计模式,确保一个类只有一个实例存在,并提供一个全局访问点来获取该实例。 二、单例模式的实现方式 1.懒汉式单例 public class LazySingle…...
010607电压源和电流源受控源
电源的理论部分 1.6电压源和电流源1.理想电压源: 1.6电压源和电流源 1.理想电压源: 其两端电压总能保持定值或一定的时间函数,其值与流过它的电流i无关的元件叫理想电压源。 电路符号:中间与导线直通的圆圈 电压源:…...
快乐数求解
编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,…...
运维高级内容--为端口做标记、制定调度规则
rs: yum install mod_ssl -y #安装mod_ssl模块 让rs支持https systemctl restart http lvs: cd /boot/ ls less config-5.14.0-427.13.1.el9_4.x86_64 ipvsadm -A -t 192.168.0.200:80 -s rr ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1 #轮询调度一次…...
后端Web之HTTP协议基础介绍
目录 1.HTTP概念 2.HTTP请求协议 3.HTTP响应协议 4.HTTP协议解析 1.HTTP概念 HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网数据通信的基础,允许将超…...
深入解析Nginx限流策略:如何高效控制访问频率
摘要:本文将详细介绍Nginx限流模块的使用方法,包括基于IP地址的限流、基于并发连接的限流以及如何应对突发流量。通过实际案例,帮助读者掌握Nginx限流策略,确保服务器在高并发场景下的稳定运行。 一、引言 在高并发场景下&#x…...
锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测
目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer-GRU的锂电池剩余寿命预测,Transformer结合门控循环单元。 Matlab基于Transformer-GRU的锂电池剩余寿命预测(单变量) 运行环境Matlab2023b及以上。 首先从…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
