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

news2024/11/26 9:41:44

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟化设置和虚拟机相关的环境搭建

目录 0.首先声明 1.背景知识 ​编辑 2.虚拟化设置 3.安装vm15.5过程 4.安装虚拟系统 4.1下载centos7.6 4.2安装centos7.6 5.我的总结 6.我的体会 0.首先声明 我的这个教程参考的就是韩顺平老师的这个linux学习教程&#xff0c;但是这个韩老师的这个教程就是2020年的教…

算法如何应用,思路都在这

目录 01 问题定义 02 问题建模 03 特征工程 04 模型选择 05 模型融合 本文深入探讨了算法在不同领域的应用方法和背后的思考逻辑。作者夏师傅通过丰富的案例分析&#xff0c;揭示了算法如何助力产品决策、优化业务流程&#xff0c;并提供了实用的策略和技巧。无论您是技术专家还…

2024 年 Web 开发者必备的 30 款 CSS 工具

2024 年 Web 开发者必备的 30 款 CSS 工具 | 瑆箫博客 找到合适的 CSS 工具可能需要花费不少时间&#xff0c;但是这份 2024 年最棒的 30 款 CSS 工具清单&#xff0c;可以让你的选择变得轻松许多。无论你的 CSS 技能水平如何&#xff0c;这份清单都能提供调试、优化代码和提升…

Bazel 快速入门与核心知识

Bazel 快速入门与核心知识 Bazel 简介 Bazel 是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目 (C/C, Java, Python, …)&#xff0c;可为多个平台构建输出。Bazel 支持跨多个代码库和大量用户的大型代码…

2024怎么选蓝牙耳机性价比品牌?四款小白必看优选王炸机型推荐!

如今国人对蓝牙耳机的选择日益重视&#xff0c;蓝牙耳机作为智能的手机备件&#xff0c;普及率也是一升再升&#xff0c;但市面上很多品牌虽然宣传自己音质好和佩戴感舒适&#xff0c;其实性能不佳&#xff0c;那么2024怎么选蓝牙耳机性价比品牌&#xff1f;身为资深的蓝牙耳机…

复变函数在大模型中的应用

1. 导入 说来惭愧&#xff0c;我研究生时的研究方向是复分析&#xff0c;但毕业近十年来几乎没用到它。 我还记得实习时做自我介绍时&#xff0c;我说我的研究方向是复分析。面试官不太了解&#xff0c;我便解释说&#xff0c;这是关于对 -1 开平方得到的虚数 i 的研究。 在…

信号的捕捉

1.信号的产生 信号递达:实际执行信号的处理动作称为信号的递达 信号未决:信号从产生到递达之间的状态 进程可以阻塞某个信号 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作 注意,忽略和阻塞是不同的,只要信号阻塞就不会被递达,而忽略是递达…

【Apache Doris】数据均衡问题排查指南

原文阅读&#xff1a;【巨人肩膀社区博客分享】【Apache Doris】数据均衡问题排查指南 一、前提概要 当集群处于以下几种情况时&#xff0c;可参考本文进行问题排查。 •BE节点之间的数据不均 •单个BE节点上的多个磁盘之间的数据不均 •BE节点的上线和下线进度卡死&#…

《高等代数》两条线行列式

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;两条线行列式的固定做法为按照第一列展开。

Kafka分布式集群部署实战:跨越理论,直击生产环境部署难题与解决方案,性能调优、监控与管理策略大揭秘,轻松上手分布式消息中间件

本文介绍kafka的集群如何部署和安装&#xff0c;1-4章理论知识&#xff0c;第5章详解集群的部署&#xff0c;部署Kafka之前需要先部署好分布式的Zookeeper&#xff0c;不喜欢理论的可以直接看第5章&#xff0c;欢迎大家一起探讨技术&#xff01; Zookeeper集群部署参考文章&…

VUE-组件间通信(三)全局事件总线

一、作用&#xff1a;任意组件间通信 二、实现 1、创建全局事件总线 new Vue({render: h > h(App),beforeCreate(){//创建全局事件总线Vue.prototype.$busthis} }).$mount(#app) 2、学生组件 触发事件 <template><div class"studentInfo"><h…

(备份)常用ASCII 8*8 点阵 以及查询显示字符的点阵

图片 #include "driver/spi_master.h" #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "string.h" #include "driver/i2c.h" #include "esp_rom_sys.h"…

【postman如何生成python代码】

postman如何生成python代码 https://jingyan.baidu.com/article/86fae3461577c27d48121ad1.html

【大模型系列篇】词向量 - 从Word2Vec到ELMo

&#x1f525;&#x1f525;&#x1f525;首先安利一个比较不错的忍不住就想一键三连的大模型科普: 大模型科普专栏 - AI老兵文哲&#xff08;哔哩哔哩&#xff09; 词向量&#xff08;又叫词嵌入&#xff09;已经成为NLP领域各种任务的必备一步&#xff0c;而且随着BERT、GPT等…

JS打造一款你自己的专用字体:使用p5.js与JavaScript实现

前言 在最近的生成艺术项目中遇到一个小问题&#xff1a;如何在作品中优雅地添加文本元素&#xff0c;同时避免使用网络字体&#xff0c;要么侵权要么花钱~~给项目增加不必要的负担&#xff0c;我决定不走寻常路&#xff0c;自己动手&#xff0c;丰衣足食&#xff0c;用JS打造…

C++11 新特性基础

前言 C11是继&#xff0c;C98/03之后的最大的一次更新&#xff0c;这次更新虽然花了很长的时间&#xff0c;但是真的推出了很多的干货&#xff01;本期内容开始我们将介绍C11常用的操作&#xff01; 目录 前言 一、C11介绍 二、统一的列表初始化 1、{}初始化 2、std::in…

【机器学习】循环神经网络(RNN)介绍

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 循环神经网络(RNN)介绍什么是RNN?RNN的基本原理递归神经网络单元前向传播反向传…

Ubuntu下安装和配置MQTT服务器Mosquitto

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;设计用于物联网设备之间的低带宽、不稳定网络环境下的高效通信。MQTT允许设备通过发布&#xff08;publish&#xff09;和订阅&#xff08;subscribe&#xff09;模式进行消…

清华2024内地录取3500人,其中900多人是走这个政策进来的... ...

2024年&#xff0c; 清华大学共录取本科新生3800余人&#xff0c;其中内地学生3500余人&#xff0c;覆盖全国31个省份1000 多所生源中学;港澳台学生60余人&#xff0c;国际学生约230人。 大李露个脸 清华大学2024年新生数据 普通批提前批共录取1549人&#xff0c;占比44% 强基计…

火龙果检测-目标检测数据集(包括VOC格式、YOLO格式)

火龙果检测-目标检测数据集&#xff08;包括VOC格式、YOLO格式&#xff09; 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1NdRBsHnYCK9xZd7bzQoN5w?pwd779l 提取码&#xff1a;779l 数据集信息介绍&#xff1a; 共有 1106 张图像和一一对应的标注文件 标注…