当前位置: 首页 > news >正文

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

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-1return dp[n-1];}
};

优化版本 

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n+1);//将新加入的位置置为1dp[0] = 1;//将原来的第一个位置的初始值右移dp[1] = (s[1-1] != '0');for(int i = 2;i <= n;i++){//当第i个位置可以单独解码则加上前i-1个位置的可能性//第i个位置的映射下标为i-1if(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.lryc.cn/news/455810.html

相关文章:

  • 每天一个数据分析题(四百九十二)- 主成分分析与因子分析
  • Linux shell编程学习笔记86:sensors命令——硬件体温计
  • 基于SSM车位租赁系统【附源码】
  • JAVA开源项目 新生报到网站 计算机毕业设计
  • QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题
  • 修改银河麒麟操作系统V10(SP1)网卡名称为ethx
  • MySQL多表查询:标量子查询
  • C++学习笔记----8、掌握类与对象(六)---- 操作符重载(1)
  • Ascend C 自定义算子开发:高效的算子实现
  • 面向对象技术——设计模式
  • 2024 Mysql基础与进阶操作系列之MySQL触发器详解(20)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
  • 找不到concrt140.dll如何修复,快来试试这6种解决方法
  • 年会工作会议会务报名签到小程序开源版开发
  • UE C++ 实时加载模型的总结
  • 实施威胁暴露管理、降低网络风险暴露的最佳实践
  • 51.哀家要长脑子了!
  • Overleaf 无法显示图片
  • 如何实现 C/C++ 与 Python 的通信?
  • 音视频入门基础:FLV专题(13)——FFmpeg源码中,解析任意Type值的SCRIPTDATAVALUE类型的实现
  • jvm里的metaspace oom 排查问题思路-使用MAT
  • 2025舜宇招聘【内推码】
  • APP自动化搭建与应用
  • kafka-windows集群部署
  • 4个顶级的大模型推理引擎
  • Oracle中ADD_MONTHS()函数详解
  • 【SQL】掌握SQL查询技巧:高效数据整合与查询优化
  • 一个月学会Java 第5天 控制结构
  • 世界职业院校技能大赛(大数据技术与应用)参赛项目介绍内容模拟示例参考
  • 【Python】文件及目录
  • OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(下)