Java Leetcode 动态规划 91. 解码方法

news2024/9/27 21:30:46

 

         未优化版本代码展示:

class Solution {
    public int numDecodings(String s) {
        char[]chars=s.toCharArray();
        int length=s.length();
        //创建dp数组
        int[]dp=new int[length];
        //初始化
        if(chars[0]!='0'){
            dp[0]=1;
        }
        //特殊情况处理
        if(length==1){
            return dp[0];
        }
        if(chars[1]!='0'){
            dp[1]+=dp[0];
        }
        int num=(chars[0]-'0')*10+(chars[1]-'0');
        if(num>=10&&num<=26){
            dp[1]++;
        }
        //填表
        for(int i=2;i<length;i++){
            if(chars[i]!='0'){
                dp[i]+=dp[i-1];
            }
            int num1=(chars[i-1]-'0')*10+(chars[i]-'0');
            if(num1>=10&&num1<=26){
                dp[i]+=dp[i-2];
            }
        }

        return dp[length-1];
    }
}

        1.状态表示:

        在思考线性动态规划的题时,我们一般采用从左到右或者从右到左的思考方式

        假设我们现在要求从下标为0到下标为i的数符的解码方式总数,我们可以分为两种情况

(1).下标为i的数符可以直接解码为一个字母

        此时我们只需要在前面所有的解码方式后添加一个字目即可,而前面所有的解码方式数为dp[i-1]所以此时获得了dp[i-1]个解码方式

(2).下标为i的数符和下标为i-1的数符两个可以代表一个字母,此时我们只需要在前面所有的解码方式后加上一个字母即可,而此时前面所有的解码方式为dp[i-2]

        2.由此我们可以获得状态转移方程如果s[i]!='0'则dp[i]+=dp[i-1]

                                                   如果26>=(s[i-1]-'0')*10+(s[i]-'0')>=10 则dp[i]+=dp[i-2]

        3.接下来创建好dp数组

        4.初始化dp数组,由于状态转移方程需要dp[i-1],dp[i-2],所以需要初始化dp[0]和dp[1]的值,避免出现非法访问的情况

        5.根据状态转移方程填写dp数组

        6.返回值

根据以上步骤便解决了动态规划的问题

优化

        我们观察上面的代码便能发现初始化dp[1]略显繁琐,所以我们可以通过添加辅助结点的方式进行初始化,这也是动态规划经常使用的优化初始化的方法

代码如下:

        

class Solution {
    public int numDecodings(String s) {
        char[]chars=s.toCharArray();
        int length=s.length();
        //创建dp数组
        int[]dp=new int[length+1];
        //初始化
        dp[0]=1;
        if(chars[0]!='0'){
            dp[1]=1;
        }
        //特殊情况处理
        if(length==1){
            return dp[1];
        }
        //填表
        for(int i=2;i<=length;i++){
            if(chars[i-1]!='0'){
                dp[i]+=dp[i-1];
            }
            int num1=(chars[i-2]-'0')*10+(chars[i-1]-'0');
            if(num1>=10&&num1<=26){
                dp[i]+=dp[i-2];
            }
        }

        return dp[length];
    }
}

       

使⽤这种技巧要注意两个点:

(1).辅助结点⾥⾯的值要保证后续填表是正确的;

(2).下标的映射关系

我们通过添加一个辅助结点,将原来dp数组中的数全部向后移动一个位置

 这样我们就可以在循环中给之前较为麻烦的dp[1]进行初始化

        而新dp表的dp[0]应该填的数要根据题意来判断,一般是填写0,但该题填写的是1,可以推算一下合适的值当在新dp表中给dp[2]赋值时,当s[1]字符可以表示编码为一个字母,则dp[2]+=dp[1],

当s[0]字符与s[1]字符可以表示编码为一个字母,则dp[2]+=dp[0],而dp[0]要为1才能给dp[2]添加一种编码方式,所以dp[0]应该为1

        初始化完成后更改一下新dp表与字符下标之间的映射关系便可完成优化。

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

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

相关文章

Postman高级应用——变量、流程控制、调试、公共函数、外部数据文件

目录 流程控制 调试 公共函数 外部数据文件 总结&#xff1a; Postman 提供了四种类型的变量 环境变量&#xff08;Environment Variable&#xff09; 不同的环境&#xff0c;使用不同的环境变量&#xff0c;例如&#xff1a;测试过程中经常会用到 测试环境&#xff0c;外…

PHP5.4以下解决json_encode中文UNICODE转码问题

PHP5.4以下解决json_encode中文UNICODE转码问题 把汉字先urlencode 然后再使用json_encode&#xff0c; json_encode之后 再次使用urldecode来解码&#xff0c; 这样编码出来的json数组中的 汉字就不会出现unicode编码了。 $params[importList][recipientAddress] urlencode(&…

Spring WebFlux使用函数式编程模型构建异步非阻塞服务

1 前言 上文引入了 Spring 框架中专门用于构建响应式 Web 服务的 WebFlux 框架&#xff0c;同时我也给出了两种创建 RESTful 风格 HTTP 端点实现方法中的一种&#xff0c;即注解编程模型。 本文介绍另一种实现方法——如何使用函数式编程模型创建响应式 RESTful 服务&#xf…

解决子元素设置margin-top使父元素也跟着向下移动的问题

先看代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

rpc、gRPC快速入门,python调用,protobuf协议

什么是rpc?grpc又是什么&#xff1f; 什么是RPC 远程过程调用协议RPC (Remote Procedure Call Protocol) RPC是指远程过程调用&#xff0c;也就是说两台服务器A&#xff0c;B&#xff0c;一个应用部署在A服务器上&#xff0c;想要调用B服务器上应用提供的函数/方法&#xff…

何洁「桔梗」2023巡演广州站7月22日强势回归!

睽违5年&#xff0c;从心出发。7月22日&#xff0c;何洁携新专辑《桔梗》和你相约广州。这次巡回演唱会不仅会带来回忆满满的经典曲目&#xff0c;全新专辑里的作品也会惊喜开唱&#xff0c;期待值拉满。 19岁时年少成名&#xff0c;以不服输的态度诠释音乐至今&#xff0c;应该…

linux中安装nginx

2.安装nginx 2.1 安装nginx前&#xff0c;需要安装的依赖&#xff08;可能是由于nginx版本旧原因&#xff0c;可能最新或较新版本不需安装这些依赖&#xff09; 如下四个依赖需要安装到linux中 2.1.1 安装 pcre 依赖 &#xff08;使用wget命令&#xff09; 步骤一&#xff1…

自动应急灯电路/12V供电的电子节能灯电路设计

自动应急灯电路 本例介绍的自动应急灯&#xff0c;在白天或夜晚有灯光时不工作&#xff0c;当夜晚关灯后或停电时能自动点亮&#xff0c;延时一段时间后能自动熄灭。 一、电路工作原理 电路原理如图 25 所示。 该自动应急灯电路由光控灯电路、电子开关电路和延时照明电路组成…

关于时间序列的平稳性检测

时间序列的平稳性检验 对时间序列的研究和处理&#xff0c;其实也算是有点意思。很多时候就是耍流氓&#xff0c;我们假设它有规律&#xff0c;然后去研究它&#xff0c;等老天开眼的时候&#xff0c;总能找出点东西来自圆其说&#xff0c;嘿嘿。 ARIMA家族的时序模型&#xf…

Java基层云HIS系统源码融合B/S电子病历系统(SaaS模式)

一、云his系统概述 ta是一款满足二甲医院、基层医院机构业务需要的健康卫生云系统。该系统能帮助基层医院机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;还能与公卫、PAC…

LPDDR4X Ball Description(引脚描述)

SymbolType&#xff08;DDR视角&#xff09;Function中文翻译CK_A CK_An CK_B CK_BnInputClock: CK and CKn are differential clock inputs. All address, command, and control input signals are sampled on the crossing of the positive edge of CK and the negative edge…

Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务六&#xff1a;训练FastText、Word2Vec词向量 任务六&#xff1a;学会训练FastText、Word2Vec词向量 说明&#xff1a;在这个任务中&#xff0c;你将学习如何训练FastText和Word2Vec词向量模型&#xff0c;这些词向量…

网络安全(黑客)自学方法

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01;点击查看详细路线图 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xf…

Transformer详细解释

transformer的细节到底是怎么样的&#xff1f;Transformer 连环18问&#xff01; 4.1 从功能角度&#xff0c;Transformer Encoder的核心作用是提取特征&#xff0c;也有使用Transformer Decoder来提取特征。例如&#xff0c;一个人学习跳舞&#xff0c;Encoder是看别人是如何…

IDEA中springboot的热加载thymeleaf静态html页面

1.首先加入开发工具依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency> 2.其次在build maven插件中开启热部署 <bu…

第43节:cesium 大雾效果(自定义代码)(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

STM32 Proteus UCOSII系统多路数据采集系统8路开关量4路电压-0058

STM32 Proteus UCOSII系统多路数据采集系统8路开关量4路电压-0058 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统多路数据采集系统8路开关量4路电压-0058 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器8路光耦隔离开关量采集4路微小信号…

Python实现PSO粒子群优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

浅谈应急照明设计与应用

安科瑞 华楠 【摘要】应急照明是因正常照明的电源失效而启用的照明。应急照明作为工业及民用建筑照明设施的一个部分&#xff0c;同人身安全和建筑物、设备安全息息相关。本文对应急照明设计的主要内容进行了介绍,主要内容包括&#xff1a;应急照明的分类及含义&#xff0c;应…

如何有效地提取背景音乐并消除人声?分享这几个方法给大家!

如何有效地提取背景音乐并消除人声&#xff1f;在制作视频或音频项目时&#xff0c;我们经常需要从原始音频中提取背景音乐并消除人声。这个过程可能对初学者来说并不简单&#xff0c;因为它需要一些专门的技术和工具。为了帮助你解决这个问题&#xff0c;我们将分享三种常用的…