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

力扣力扣力:91.解码方法

91. 解码方法 - 力扣(LeetCode)

在完成动态规划入门之后,我们先整一个中档题,也是前面简单题的变体。

分析思路:

在拿到最终结果之前,我们应该明确什么样的数字序列能够解码。

规则1:由于只有26个字母,所以如果是前后两位数字,必须要在1~26之间

规则2:单个0不能直接映射,例如03、05这种也不能映射,只有10和20才能够含有0

规则3:如果是单个映射那就只能在1~9之间,如果是两位数映射那么十位上只能是1或者2,如果是1的话,个位的范围是0~9,如果是2的话,个位的范围是0~6,也就是两位数在10~26之间

如果我们免去映射规则,那么这道题就退化成一次只能上一个或者两个台阶的题目了。所以这道题的区别就在于,有些台阶不能迈腿例如出现04,有些地方例如10或者20,只能迈两步不能迈一步,所以需要通过制定上面的规则来筛选出不能迈腿的地方,然后用台阶问题的模板解决。

接下里我们通过回答五个问题来逐步分析解题需要的过程。

1.状态表示什么

根据经验和题目要求,不难得到这道题的dp[i]可以表示为以i位置为结尾的解码方法的总数。我们一般先考虑从结尾向前,所以离结尾最近的一步有两种情况,据此写出状态转移方程。

2.状态转移方程

情况一:最后一步是单独解码,根据上面的规则可以知道,如果单独解码的数字在1~9之间则解码成功,否则解码失败不进行累加。

情况二:最后一步解码了两位数,根据上面的规则可以知道,如果两位数解码的数字在10~26之间则解码成功,否则解码失败不进行累加。

所以在两种情况都解码成功的情况下,状态转移方程为dp[i]=dp[i-1]+dp[i-2]

3.初始化

dp[0]:如果解码成功则为1,否则为0

dp[1]:情况一:单步和双步两种方法都解码失败,此时为0

情况二:单步和双步有一种成功一种失败,此时为1

情况三:单步和双步都解码成功,此时为2

4.填表顺序

根据状态转移方程可以知道:后面的值依赖前面的值,所以是从前往后填

5.返回值

按照dp[i]的定义可以知道,最后返回的就是dp[n-1]

具体实现:

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n);//初始化dp[0] = (s[0] != '0');//先处理边界情况if(n == 1) return dp[0];//如果前两个数都不为0,就说明能单步解码if(s[0] != '0' && s[1] != '0')dp[1] += 1;int num = (s[0] - '0') *10 + s[1] -'0';//通过ASCII码转化来保存前两个位表示的数if(num>=10 && num<=26)dp[1] += 1;//填表for(int i=2;i<n;i++){if(s[i] != '0')dp[i] += dp[i-1];int tmp = (s[i-1] - '0')* 10 + s[i] - '0';//保存这种情况代表的两位数if(tmp>=10 && tmp<=26)dp[i] += dp[i-2];} return dp[n-1];}
};
http://www.lryc.cn/news/481148.html

相关文章:

  • 一些面试题总结(二)
  • Hive-testbench套件使用文档
  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:新技术融合的无限可能(下)(12/30)
  • Python | Leetcode Python题解之第540题有序数组中的单一元素
  • AHB Matrix 四星级 验证笔记(2.4) Tt3.3AHB总线协议测试时的 并行数据
  • 前端零基础学习Day-Eight
  • 贪心算法day3(最长递增序列问题)
  • 【论文复现】MSA+抑郁症模型总结(三)
  • 【软件测试】敏捷模型(Scrum模型)和V模型、W模型
  • 【go从零单排】接口(interface)和多态(Polymorphism)
  • SI5319C-C-GM,SiliconLabs芯科 SI5319C-C-GMR,时钟合成器/抖动清除器 封装 QFN-36 在售 20000PCS 23+
  • 使用批处理脚本批量删除Maven无效依赖
  • 腾讯cos对象存储,下行流量费贵,是否可以加入服务器减少费用,架构如何设计
  • 【SAP】关于权限的继承
  • SpringBoot技术下的共享汽车运营平台
  • SwiftUI开发教程系列 - 第7章:数据流和状态管理
  • Ubuntu系统安装NVIDIA驱动、CUDA、PyTorch等GPU深度学习环境
  • 电子学会2024年3月青少年软件编程(图形化)等级考试试卷(三级)真题,含答案解析
  • 初学者指南:用例图——开启您的软件工程之旅
  • 二叉树遍历/算法数据结构
  • C#字符串的不可变性:内存管理与线程安全的优势分析
  • 【杂记】之语法学习第四课手写函数与结构体
  • 细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的另一种方法
  • python使用turtle画图快速入门,轻松完成作业练习
  • 【C++】新手入门指南
  • C++使用开源ConcurrentQueue库处理自定义业务数据类
  • 在vue3的vite网络请求报错 [vite] http proxy error:
  • ElasticSearch 简单的查询。查询存在该字段的资源,更新,统计
  • FOFA使用教程之从零到精通
  • 【提高篇】3.2 GPIO(二,基本结构)