【动态规划专栏】专题一:斐波那契数列模型--------4.解码方法

简介: 【动态规划专栏】专题一:斐波那契数列模型--------4.解码方法


题目来源

本题来源为:

Leetcode91. 解码方法

题目描述

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

‘A’ -> “1”

‘B’ -> “2”

‘Z’ -> “26”

要解码已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:

“AAJF” ,将消息分组为 (1 1 10 6)

“KJF” ,将消息分组为 (11 10 6)

注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回解码 方法的总数 。

题目数据保证答案肯定是一个 32 位 的整数

题目解析

解码按照规则解码即可,但是前导0不可解码。

算法原理

1.状态表示

经验+题目要求:

以i位置为结尾…

对于本题而言就是:

dp[i]表示:以i位置为结尾时,解码方法的总数

2.状态转移方程

在推方程之前,我们先画一下解码的情况:

分为单独解码和与前一个位置一起解码两种情况:

而单独解码和一起解码又要分为两种情况,成功和失败。

为什么会失败呢?

举个例子:

2和5可以一起解码,也可以分开解码,但到0位置时,就会解码错误,自己单独不能解码,要是与后面的6结合,

会出现之前说的前导0情况,也会解码错误。

因此,本题的状态转移方程为:

dp[i] = dp[i-1]+ dp[i-2]

3.初始化

本题初始化要在下标为0位置与下标为1位置进行初始化:

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;

4.填表顺序

根据状态转移方程,我们计算dp[i]位置的值需要i-1与i-2位置的值,因此我们的填表顺序为:从左往右

5.返回值

我们要解码到最后一个位置,因此:返回dp[n-1]

代码实现

class Solution 
{
public:
    int numDecodings(string s) 
    {
        // 1.创建dp表
        // 2.初始化
        // 3.填表
        // 4.返回值
        int n=s.size();
        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];
        }
        return dp[n-1];
    }
};


相关文章
|
11月前
|
运维 自然语言处理 Linux
os-copilot安装和使用体验测评
OS Copilot是阿里云推出的操作系统智能助手,基于大模型技术,支持自然语言问答、命令执行和系统运维调优等功能,帮助用户更高效地使用Linux系统。本文介绍了OS Copilot的产品优势、功能特点及使用方法,包括对话模式、-t/-f/管道等参数的使用,以及安装和配置步骤。通过OS Copilot,用户可以简化复杂命令的操作,提升工作效率。同时,文中也分享了个人开发者在实际使用中的体验和建议,指出了一些有待改进的地方。
|
6月前
|
监控 算法 安全
公司电脑监控软件关键技术探析:C# 环形缓冲区算法的理论与实践
环形缓冲区(Ring Buffer)是企业信息安全管理中电脑监控系统设计的核心数据结构,适用于高并发、高速率与短时有效的多源异构数据处理场景。其通过固定大小的连续内存空间实现闭环存储,具备内存优化、操作高效、数据时效管理和并发支持等优势。文章以C#语言为例,展示了线程安全的环形缓冲区实现,并结合URL访问记录监控应用场景,分析了其在流量削峰、关键数据保护和高性能处理中的适配性。该结构在日志捕获和事件缓冲中表现出色,对提升监控系统效能具有重要价值。
176 1
|
9月前
|
人工智能 智能设计 算法
中传广告学院x阿里云设计中心《通义高校百万创作人》AIGC宣传片共建校企合作实践平台
中传广告学院x阿里云设计中心《通义高校百万创作人》AIGC宣传片共建校企合作实践平台
计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
983 0
什么是复数
【10月更文挑战第12天】什么是复数
2475 1
|
程序员 Go 区块链
GitHub 用户福利,符合条件可领取约 1500 元现金
Starknet 空投,GitHub 用户可以试下,有资格的可以领取代币,最终可提现 1500 元左右。
243 0
|
存储 监控 NoSQL
Celery是一个基于分布式消息传递的异步任务队列/作业队列
Celery是一个基于分布式消息传递的异步任务队列/作业队列
|
存储 程序员 Python
Python函数定义与调用详解
Python中的函数是可重用代码块,用于接收参数、执行操作并可能返回输出。通过`def`定义函数,如`def greet(name): print(f&quot;Hello, {name}!&quot;)`。函数可接受任意数量的参数,包括默认值。调用函数时提供参数,如`greet(&quot;Alice&quot;)`。可变参数通过星号(*)和双星号(**)实现。函数有助于代码模块化、理解和维护。掌握函数是Python编程基础。
|
弹性计算 Java 关系型数据库
阿里云的e实例评测
阿里云的e实例是一款针对个人开发者、学生、小微企业的入门级云服务器,旨在满足中小型网站建设、开发测试、轻量级应用等场景的需求。
494 5
ps中扩展画布的时候,不能选择扩展画布部分的颜色解决方法
ps中扩展画布的时候,不能选择扩展画布部分的颜色解决方法

热门文章

最新文章