(其他) 剑指 Offer 46. 把数字翻译成字符串 ——【Leetcode每日一题】

❓ 剑指 Offer 46. 把数字翻译成字符串

难度:中等

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a”1 翻译成 “b”……11 翻译成 “l”……25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

提示

  • 0 < = n u m < 2 31 0 <= num < 2^{31} 0<=num<231

💡思路:动态规划

定义 dp 数组,dp[i] 表示以第 i 个字符结尾的子串的 总 翻译方法;

如果 若 x i x_i xi x i − 1 x_{i-1} xi1 组成的两位数字可以被翻译,则 dp[i]=dp[i−1]+dp[i−2];否则 dp[i]=dp[i−1]

  • 可被翻译的两位数区间:当 x i − 1 = 0 x_{i-1} = 0 xi1=0 时,组成的两位数是无法被翻译的(例如 00, 01, 02, ),因此区间为 [10,25]
  • 所以状态转移方程为: d p [ i ] = { d p [ i − 1 ] + d p [ i − 2 ] , 10 x i − 1 + x i ∈ [ 10 , 25 ] d p [ i − 1 ] , 10 x i − 1 + x i ∈ [ 0 , 10 ) ∪ ( 25 , 99 ] dp[i]=\begin{cases}dp[i-1]+dp[i-2]&,10x_{i-1}+x_i\in[10,25]\\dp[i-1]&,10x_{i-1}+x_i\in[0,10)\cup(25,99]\end{cases} dp[i]={dp[i1]+dp[i2]dp[i1],10xi1+xi[10,25],10xi1+xi[0,10)(25,99]

观察上面的 状态转移方程,发现 dp[i] 只与 前两位 dp[i - 1]dp[i - 2] 有关,所以可以进行空间优化,我们使用 pre1 代替 dp[i - 1]pre2 代替 dp[i - 2]cur 代替 dp[i]
c u r = { p r e 1 + p r e 2 , 10 x i − 1 + x i ∈ [ 10 , 25 ] p r e 1 , 10 x i − 1 + x i ∈ [ 0 , 10 ) ∪ ( 25 , 99 ] cur=\begin{cases}pre1+pre2&,10x_{i-1}+x_i\in[10,25]\\pre1&,10x_{i-1}+x_i\in[0,10)\cup(25,99]\end{cases} cur={pre1+pre2pre1,10xi1+xi[10,25],10xi1+xi[0,10)(25,99]

  • 当前 状态 cur 处理完, prepre2 共同前移一位,进而可以表示为:
    p r e 1 = { p r e 1 + p r e 2 , 10 x i − 1 + x i ∈ [ 10 , 25 ] p r e 1 , 10 x i − 1 + x i ∈ [ 0 , 10 ) ∪ ( 25 , 99 ] pre1=\begin{cases}pre1+pre2&,10x_{i-1}+x_i\in[10,25]\\pre1&,10x_{i-1}+x_i\in[0,10)\cup(25,99]\end{cases} pre1={pre1+pre2pre1,10xi1+xi[10,25],10xi1+xi[0,10)(25,99]
    p r e 2 = { p r e 1 − p r e 2 , 10 x i − 1 + x i ∈ [ 10 , 25 ] p r e 1 , 10 x i − 1 + x i ∈ [ 0 , 10 ) ∪ ( 25 , 99 ] pre2=\begin{cases}pre1-pre2&,10x_{i-1}+x_i\in[10,25]\\pre1&,10x_{i-1}+x_i\in[0,10)\cup(25,99]\end{cases} pre2={pre1pre2pre1,10xi1+xi[10,25],10xi1+xi[0,10)(25,99]

  • 按位遍历该数字,从 左到右右到左 是相同的,本方法使用 右到左

  • 初始化:pre1 = pre2 = 1,即 “无数字” 和 “第 1 位数字” 的翻译方法数量均为 1

🍁代码:(C++、Java)

C++

class Solution {
public:int translateNum(int num) {if(num < 10) return 1;int pre1 = 1, pre2 = 1;while(num >= 10){int tmp = num % 100;if(tmp / 10 > 0 && tmp <= 25) {pre1 += pre2;pre2 = pre1 - pre2;}else{pre2 = pre1;}num /= 10;}return pre1;}
};

Java

class Solution {public int translateNum(int num) {if(num < 10) return 1;int pre1 = 1, pre2 = 1;while(num >= 10){int tmp = num % 100;if(tmp / 10 > 0 && tmp <= 25) {pre1 += pre2;pre2 = pre1 - pre2;}else{pre2 = pre1;}num /= 10;}return pre1;}
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为字符串 s 的长度。
  • 空间复杂度 O ( 1 ) O(1) O(1),使用常数大小的额外空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cpolar内网穿透

目录 一、引言二、什么是cpolar三、内网穿透四、如何使用cpolar1、下载cpolar软件安装包2、注册cpolar账号3、使用cpolar 一、引言 当我们完成了一个tomcat的web项目之后&#xff0c;如果我们想让其他电脑访问到这个项目&#xff0c;我们可以让其他电脑和本机连接到同一个局域…

leetcode刷题--栈与递归

文章目录 1. 682 棒球比赛2. 71 简化路径3. 388 文件的最长绝对路径4. 150 逆波兰表达式求值5. 227. 基本计算器II6. 224. 基本计算器7. 20. 有效的括号8. 636. 函数的独占时间9. 591. 标签验证器10. 32.最长有效括号12. 341. 扁平化嵌套列表迭代器13. 394.字符串解码 1. 682 棒…

MySQL 如何避免 RC 隔离级别下的 INSERT 死锁?

本文分析了 INSERT 及其变种&#xff08;REPLACE/INSERT ON DUPLICATE KEY UPDATE&#xff09;的几个场景的死锁及如何避免。 作者&#xff1a;张洛丹&#xff0c;DBA 数据库技术爱好者~ 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编…

win11和虚拟机上的ubuntu系统共享文件夹

出发点&#xff1a;有时候需要在虚拟机内和win11系统之间进行文件拷贝操作&#xff0c;但是虚拟机内的Vmware Tools不好用 解决方式 开启虚拟机共享文件夹 在虚拟机的Ubuntu系统内的终端命令行输入以下命令 sudo /usr/bin/vmhgfs-fuse .host:/SVMware /mnt/win -o subtype…

电子产品CE认证申请,CE-RED认证

CE认证&#xff0c;即只限于产品不危及人类、动物和货品的安全方面的基本安全要求&#xff0c;而不是一般质量要求&#xff0c;协调指令只规定主要要求&#xff0c;一般指令要求是标准的任务。 构成欧洲指令核心的"主要要求"&#xff0c;在欧共体1985年5月7日的&…

【webpack】HMR热更新原理

本文&#xff1a;参考文章 一、HMR是什么&#xff0c;为什么出现 1、出现的原因 之前&#xff0c;应用的加载、更新都是一个页面级别的操作&#xff0c;即使单个代码文件更新&#xff0c;整个页面都要刷新&#xff0c;才能拿到最新的代码同步到浏览器&#xff0c;导致会丢失…

【猿灰灰赠书活动 - 05期】- 【速学Linux:系统应用从入门到精通】

&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;博文为大家争取福利&#xff0c;与机械工业出版社合作进行送书活动 &#x1f468;‍&#x1f…

数学建模:相关性分析

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 数学建模&#xff1a;相关性分析 文章目录 数学建模&#xff1a;相关性分析相关性分析两变量的相关分析PearsonSpearmanKendall tua-b 双变量关系强度测量的指标相关系数的性质代码实现example偏相关分析 相…

云存储:实现数据备份与恢复的创新方法

文章目录 云存储的基本概念数据备份的创新方法自动化备份策略增量备份和版本控制多地点备份 数据恢复的创新方法快速数据恢复弹性扩展性数据验证和一致性 案例分析&#xff1a;AWS S3自动化备份策略增量备份和版本控制多地点备份快速数据恢复数据验证和一致性 结论 &#x1f38…

外滩大会今日开幕 生成式AI成为热议话题

2023 Inclusion外滩大会9月7日在上海黄浦世博园正式开幕。这场以“科技创造可持续未来”为主题的大会为期三天&#xff0c;近20位“两院”院士、诺贝尔奖和图灵奖得主&#xff0c;全球超500位有影响力的科技领军企业和专家学者&#xff0c;将在此带来一场科技、人文和产业的思想…

php代理刷访问量(附源码)

众所周知&#xff0c;所谓的访问量就是用户的点击次数。当然&#xff0c;如果真只是单纯记录用户的访问次数&#xff0c;那访问量刷起来也太简单了&#xff0c;不断的刷新网页就行。因此&#xff0c;常规的网站记录访问量是通过ip来的&#xff0c;一个有效ip对应一个访问量。通…

快讯 | ALVA 荣获首届“格物杯”联通物联网应用创新大赛复赛一等奖!

8 月 7 日&#xff0c;“物聚龙江 智联百业”物联网创新发展合作交流暨首届“格物杯”联通物联网应用创新大赛企业赛道复赛 (赛区四)在哈尔滨举办。 ALVA Systems 凭借智能远程协助平台—— ALVA Rainbow 在近 50 家企业中脱颖而出&#xff0c;荣获首届“格物杯”联通物联网应…