首页 > 其他分享 >动态规划之解码方法

动态规划之解码方法

时间:2023-11-02 10:11:50浏览次数:28  
标签:26 映射 int 解码 num 字符串 动态 规划

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

'A' -> 1
'B' -> 2
...
'Z' -> 26

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"111" 可以将 "1" 中的每个 "1" 映射为 "A" ,从而得到 "AAA" ,或者可以将 "11""1"(分别为 "K""A" )映射为 "KA" 。注意,"06" 不能映射为 "F" ,因为 "6""06" 不同。

给你一个只含数字的 非空 字符串 num ,请计算并返回 解码 方法的 总数 。题目数据保证答案肯定是一个 32 位 的整数。

原题链接:https://leetcode-cn.com/problems/decode-ways/

动态规划解法

确定状态

最后一步

由题可知,num是一个只含数字的非空字符串,解码规则比较简单,就是1 ~ 26分别映射为A ~ Z 26个字母,我们就知道,一个数字可以解码为一个字母,两个数字也可以解码为一个字母,
所以我们在考虑最后一步时,需要考虑到这两种情况。如下图所示:

image

如上图所示,num 为 1234523,如果最后一个解码单位为3,那么另一部分为 123452;如果最后一个解码单位为23,那么另一部分为12345。

确定子问题

确定完最后一步时,我们知道了最后一步解码单位有两种,将求解num解码方式转化为求解num-1num-2两个子问题,同时问题规模相应的变小了,如果剩余的部分可继续解码,那么还可以继续进行分解,直至不可分解为止。

转移方程

由上面的确定状态可以知,我们用f(x)代表从0~x位置字符串的解码方式数,可得转移方程为:

f(x) = f(x-1) + f(x-2)

注意上式成立是有条件的。

初始条件和边界情况

初始条件

如果输入的字符串为空串,那么解码只有只有一种方式,也解码为空串,即f(0) = 1;

边界情况

上面提到转移方程,如果当前字符串的最后两位可以进行解码,所以最后两位必须是10~26之间的某一个数,那么前面解码才会有效,即f(x) 需要加上f(x-2);
同理如果当前字符串的最后一位可以进行解码,最后一位不能是0,那么前面解码才会有效,即f(x) 需要加上f(x-1)。

代码实现

  public static int numDecodings(String s) {
    if (s == null || s.length() == 0) {
      return 0;
    }

    int[] f = new int[s.length() + 1];

    char[] chars = s.toCharArray();

    f[0] = 1;
    f[1] = chars[0] == '0' ? 0 : 1;

    for (int i = 2; i <= s.length(); i++) {
      // 如果要加上f[i - 2],那么i位置的前两位必须是可解码的,即在10 ~ 26 之间 像01,03这种是无效的。
      String is2 = String.valueOf(chars[i - 2]) + String.valueOf(chars[i - 1]);

      int i2 = Integer.parseInt(is2);
      if (i2 >= 10 && i2 <= 26) {
        f[i] += f[i-2];
      }

      // 如果要加上f[i-1],那么i位置的数字必须不能是0,否则无法继续解码
      int i1 = Integer.parseInt(String.valueOf(chars[i - 1]));

      if (i1 != 0) {
        f[i] += f[i-1];
      }
    }

    return f[s.length()];
  }

title: 动态规划之解码方法
tags: [算法,动态规划]
author: Mingshan
categories: [算法,动态规划]
date: 2021-02-22

标签:26,映射,int,解码,num,字符串,动态,规划
From: https://www.cnblogs.com/mingshan/p/17793526.html

相关文章

  • 【算法笔记】动态规划Dynamic Programming
    参考视频:5SimpleStepsforSolvingDynamicProgrammingProblems引子:最长递增子串(LongestIncreasingSubsequence,LIS)LIS([31825])=len([125])=3LIS([52863695])=len([2369])=4解决问题的三个步骤:可视化例子(visualizeexample)(“visualizee......
  • Vue动态添加style样式
    最近在用uniapp开发安卓app,由于语法跟vue一致,就梳理了下动态添加style的方法:Object :style="{fontSize:fontSize+'px'}":style="{fontSize:(fontSize?fontSize:'12')+'px'}" Array :style="[baseStyles,otherStyle......
  • 职业规划:如何成为年薪80W+的Salesforce项目经理?
    Salesforce项目经理负责监督各种Salesforce云和端到端Salesforce项目,首要任务是确保项目成功,并在预算范围内按时交付。Salesforce项目经理的薪资是不断增长的Salesforce经济中的热门话题。 Salesforce项目经理的职责项目经理的职业发展更多地关注经验、同时处理的项目数量和......
  • 线程池如何实现参数的动态修改?线程池如何调优?
    线程池如何实现参数的动态修改线程池提供了几个setter方法来设置线程池的参数。这里主要有两个思路:1、在微服务架构下,可以利用配置中心,如Nacos、Apollo等等,也可以自己开发配置中心。业务服务读取线程池配置,获取相应的线程池实例来修改线程池的参数。2、如果限制了配置中心的使用,也......
  • 解码注意力Attention机制:从技术解析到PyTorch实战
    在本文中,我们深入探讨了注意力机制的理论基础和实际应用。从其历史发展和基础定义,到具体的数学模型,再到其在自然语言处理和计算机视觉等多个人工智能子领域的应用实例,本文为您提供了一个全面且深入的视角。通过Python和PyTorch代码示例,我们还展示了如何实现这一先进的机制。关......
  • 解码注意力Attention机制:从技术解析到PyTorch实战
    在本文中,我们深入探讨了注意力机制的理论基础和实际应用。从其历史发展和基础定义,到具体的数学模型,再到其在自然语言处理和计算机视觉等多个人工智能子领域的应用实例,本文为您提供了一个全面且深入的视角。通过Python和PyTorch代码示例,我们还展示了如何实现这一先进的机制。关......
  • 《安富莱嵌入式周报》第320期:键盘敲击声解码, 军工级boot设计,开源CNC运动控制器,C语言
     视频版:https://www.bilibili.com/video/BV1Cr4y1d7Mp/1、键盘敲击声解码https://arxiv.org/abs/2308.01074键盘敲击声被解码的话,我们使用键盘输入密码将被方便的解码出来。这篇文章介绍了一种使用最先进的深度学习模型,以便使用手机麦克风对笔记本电脑敲击键盘分析。实际测试训练......
  • xml映射文件以及动态sql笔记
     ......
  • web中静态资源和动态资源的区别
    **静态资源:**可以理解为前端的固定页面,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面,也就是说不需要从后台通过读取数据库信息就可以将在html上的所有数据全部显示出来,他的访问数据由于是不需要从数据库拉取数据,故而访问速度很快。**动态......
  • 基于Vue.js和Vanta.js的动态天空颜色效果实现
    背景最近在写一个Vue项目,想要在登录界面加一个动态背景效果,搜索之后发现了Vanta.js(https://www.vantajs.com/)这个库。Vanta可以借助three.js(WebGL)或p5.js渲染动态的3D背景效果,提供了多种预设。几种效果都挺不错的,最终我决定采用clouds效果。随即我发现这个效果是可......