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

算法的学习笔记—把数字翻译成字符串

img

😀前言
在日常生活中,我们经常会遇到各种编码和解码的问题。今天,我们将讨论一个有趣的问题:如何将一串数字翻译成字母,并计算出有多少种不同的翻译方法。

🏠个人主页:尘觉主页

文章目录

  • 💝把数字翻译成字符串
    • 💞问题描述
    • ❤️‍🔥解题思路
      • 步骤
    • 🥰代码实现
      • 代码解析
    • 😄总结

💝把数字翻译成字符串

Leetcode

💞问题描述

给定一个由数字组成的字符串,我们需要按照以下规则将其翻译成字母:

  • 数字1-26分别对应字母a-z,例如1对应a,2对应b,…,26对应z。
  • 例如,对于输入“12258”,它可以被翻译为以下几种不同的字符串:
    • “abbeh”
    • “lbeh”
    • “aveh”
    • “abyh”
    • “lyh”

总共有5种不同的翻译方式。我们的任务是实现一个函数来计算一个数字字符串有多少种不同的翻译方法。

❤️‍🔥解题思路

要解决这个问题,我们可以使用动态规划(Dynamic Programming)的方法。动态规划是一种将问题分解成更小的子问题并逐步解决的技术。在这个问题中,我们可以逐步计算每个子字符串的解码方式。

步骤

  1. 初始化动态规划数组:我们使用一个数组 dp 来记录每个位置的翻译方法数。dp[i] 表示字符串前 i 个字符的翻译方法数。
  2. 处理边界情况:首先,如果字符串为空或首字符为’0’,则没有合法的翻译方法。
  3. 状态转移方程
    • 如果当前位置的一个数字可以独立翻译(即不为’0’),则该位置的翻译方法数应加上前一位置的翻译方法数,即 dp[i] += dp[i - 1]
    • 如果当前位置的两个数字组合在一起可以翻译(即其值在10到26之间),则该位置的翻译方法数应加上前两位置的翻译方法数,即 dp[i] += dp[i - 2]
  4. 返回结果:最终,dp[n]n为字符串的长度)就是我们需要的结果。

🥰代码实现

以下是具体的代码实现:

public int numDecodings(String s) {// 如果字符串为空或以'0'开头,则没有合法的翻译方法if (s == null || s.length() == 0) {return 0;}int n = s.length();int[] dp = new int[n + 1];// 初始化,空字符串有一种翻译方式dp[0] = 1;// 如果字符串的第一个字符不为'0',则有一种翻译方式dp[1] = s.charAt(0) == '0' ? 0 : 1;// 动态规划求解for (int i = 2; i <= n; i++) {// 处理单个数字的翻译int one = Integer.valueOf(s.substring(i - 1, i));if (one != 0) {dp[i] += dp[i - 1];}// 处理两个数字组合的翻译if (s.charAt(i - 2) != '0') {int two = Integer.valueOf(s.substring(i - 2, i));if (two <= 26) {dp[i] += dp[i - 2];}}}// 返回最后的结果return dp[n];
}

代码解析

  • 初始化部分dp[0] 初始化为1,表示空字符串有一种翻译方式。dp[1] 根据字符串的第一个字符是否为’0’来确定是否有合法的翻译方式。
  • 主循环:从第二个字符开始,每次计算一个字符和两个字符的翻译可能性,并累加到 dp[i] 中。
  • 时间复杂度:该算法的时间复杂度为O(n),其中n为字符串的长度。

😄总结

通过动态规划的方法,我们可以高效地计算出一个数字字符串有多少种不同的翻译方法。这个问题不仅考察了我们对动态规划的理解,还让我们熟悉了如何处理字符串中的边界情况和状态转移。希望通过这个例子的讲解,能够帮助你更好地理解动态规划的应用。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 23. 如何使用Collections.synchronizedList()方法来创建线程安全的集合?有哪些注意事项?
  • 【数据结构初阶】二叉树--堆(顺序结构实现)
  • Linux——命令行文件的管理(创建,复制,删除,移动文件,硬链接与软链接)
  • 【Qt】工具栏
  • 中国能建VS中国电建的渊源和区别及中国七大基建狂魔
  • this.$nextTick() 是 Vue.js 提供的一个方法
  • 【化学方程式配平 / 3】
  • ubuntu 22.04安装NVIDIA驱动和CUDA
  • 华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题——(共九套)(每套四十题)
  • Sentinel-1 Level 1数据处理的详细算法定义(十)
  • VUE使用websocket
  • 跑Boundary-Aware Feature Propagation遇到的问题
  • 【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程
  • 【kafa系列】kafka如何保证消息不丢失
  • 常用git命令
  • 【React系列】如何构建React应用程序
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • ES6--对象的扩展
  • happypack两次报错的问题
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Python爬虫--- 1.3 BS4库的解析器
  • React-flux杂记
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Transformer-XL: Unleashing the Potential of Attention Models
  • ucore操作系统实验笔记 - 重新理解中断
  • Webpack 4x 之路 ( 四 )
  • 阿里云Kubernetes容器服务上体验Knative
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 自定义函数
  • ​插件化DPI在商用WIFI中的价值
  • ​香农与信息论三大定律
  • #100天计划# 2013年9月29日
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Lua:Lua调用C++生成的DLL库
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (9)目标检测_SSD的原理
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (独孤九剑)--文件系统
  • (二)WCF的Binding模型
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (九十四)函数和二维数组
  • (自适应手机端)行业协会机构网站模板
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .gitignore
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net与java建立WebService再互相调用
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国