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

news2025/7/28 10:56:59

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

难度: m i d d l e \color{orange}{middle} middle

其实就是有条件的 青蛙跳格子 问题。


题目描述

给定一个数字,我们按照如下规则把它翻译为字符串: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

算法

(动态规划) O ( n ) O(n) O(n)

翻译的过程可以分为两种情况:

  • 首先我们可以把每一位单独翻译
  • 然后我们考虑组合某些连续的两位

那么我们可以归纳出翻译的规则,字符串的第 i i i 位置:

  • 可以单独作为一位来翻译
  • 如果第 i − 1 i−1 i1 位和第 i i i 位组成的数字在 1025 之间,可以把这两位连起来翻译。含有前导零的两位数不在题目规定的翻译规则中,比如 [1, 4, 02]这种翻译是不对的。

我们可以用 f ( i ) f(i) f(i) 表示以第 i i i 位结尾的前缀串翻译的方案数。考虑第 i i i 位单独翻译和与前一位连接起来再翻译对 f ( i ) f(i) f(i) 的贡献。单独翻译对 f ( i ) f(i) f(i) 的贡献为 f ( i − 1 ) f(i−1) f(i1);如果第 i − 1 i−1 i1 位存在,并且第 i − 1 i−1 i1 位和第 i i i 位形成的数字 x x x 满足 10 ≤ x ≤ 25 10≤x≤25 10x25,那么就可以把第 i − 1 i−1 i1 位和第 i i i 位连起来一起翻译,对 f ( i ) f(i) f(i) 的贡献为 f ( i − 2 ) f(i−2) f(i2),否则为 0 0 0。我们可以列出这样的动态规划转移方程:

f ( i ) = f ( i − 1 ) + f ( i − 2 ) [ i − 1 ≥ 0 , 10 ≤ x ≤ 25 ] f(i)=f(i−1)+f(i−2)[i−1≥0,10≤x≤25] f(i)=f(i1)+f(i2)[i10,10x25]

边界条件为 f [ 0 ] = 1 f[0] = 1 f[0]=1,下文有解释。

在这里插入图片描述

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n)

  • 空间复杂度 : O ( n ) O(n) O(n),字符串使用额外的空间。

C++ 代码

class Solution {
public:
    int translateNum(int num) {
        string s = to_string(num);
        int n = s.size();
        vector<int> f(n + 1);
        f[0] = 1;

        for (int i = 1; i <= n; i ++) {
            f[i] = f[i - 1];

            if (i > 1) {
                int t = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');
                // 为什么大于10, 因为含有前导零的两位数不在题目规定的翻译规则中,比如02、03等等
                if (t >= 10 && t <= 25) f[i] += f[i - 2];
            }
        }

        return f[n];
    }
};

Q:为什么一个数字都没有的方案数是 1

A:f[0] 代表翻译前 0 个数字的方法数,这样的状态定义其实是没有实际意义的,但是 f[0] 的值需要保证边界是对的,即 f[1]f[2] 是对的。比如说,翻译前 1 个数只有一种方法,将其单独翻译,即 f[1] = f[1 - 1] = 1。翻译前两个数,
如果第 1 个数和第 2 个数可以组合起来翻译,那么 f[2] = f[1] + f[0] = 2 ,否则只能单独翻译第 2 个数,即 f[2] = f[1] = 1。因此,在任何情况下 f[0]1 都可以保证 f[1]f[2] 是正确的,所以 f[0] 应该取 1

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

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

相关文章

GitHub狂飙30K+star面试现场,专为程序员面试打造,现已开源可下载

《程序员面试现场》上线2个月已经在GitHub上已经狂飙到30Kstar&#xff08;能在在GitHub上拿到30K的star&#xff0c;有没有干货&#xff0c;我就不多说了&#xff09;总结的很全面&#xff0c;主要是针对面试之前的准备工作&#xff0c;分为知彼、知己、问答、贯通、综合五部分…

06- OpenCV查找图像轮廓 (OpenCV系列) (机器视觉)

知识重点 灰度图转换: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)二值化: 返回两个东西&#xff0c;一个阈值&#xff0c; 一个是二值化的图: thresh, binary cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)查找轮廓: 返回两个结果&#xff0c;分别是轮廓和层级: c…

白帽黑客入行应该怎么学?零基础小白也能轻松上手!

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 1为什么网络安全行业是IT行业最后的红利&#xff1f; 根据腾讯安全发布的《互联网安全报告》&#xff0c;…

Python每日一练(20230224)

目录 1. 列表奇偶拆分 ★ 2. 二叉树的后序遍历 ★★ 3. 接雨水 ★★★ 附录 二叉树 特点 性质 特殊二叉树 满二叉树 完全二叉树 完全二叉树性质 二叉树的遍历 1. 列表奇偶拆分 【问题描述】 输入一个列表&#xff0c;包含若干个整数&#xff08;允许为空&#xff…

Spring Batch 高级篇-并行步骤

目录 引言 概念 案例 转视频版 引言 接着上篇&#xff1a;Spring Batch 高级篇-多线程步骤&#xff0c;了解Spring Batch多线程步骤后&#xff0c;接下来一起学习一下Spring Batch 高级功能-并行步骤 概念 并行步骤&#xff0c;指的是某2个或者多个步骤同时执行。比如下…

Ask林曦|来回答,30个你关心的日常问题(二)

在林曦老师的线上书法直播课上&#xff0c;上课前后的聊天时间里&#xff0c;时常有同学向林曦老师提问&#xff0c;这些问题涵盖了日常生活的诸多方面&#xff0c;从身体的保养&#xff0c;到快乐的法门&#xff0c;皆是大家感兴趣的&#xff0c;也都共同关切的。   暄桐教室…

python+Vue学生作业系统 django课程在线学习网站系统

系统分为学生&#xff0c;教师&#xff0c;管理员三个角色&#xff1a; 学生功能&#xff1a; 1.学生注册登录系统 2.学生查看个人信息&#xff0c;修改个人信息 3.学生查看主页综合评价&#xff0c;查看今日值班信息 4.学生在线申请请假信息&#xff0c;查看请假的审核结果和请…

180、【动态规划】leetcode ——583. 两个字符串的删除操作:两种动态规划思路(C++版本)

题目描述 原题链接&#xff1a;583. 两个字符串的删除操作 解题思路 &#xff08;1&#xff09;基于求最长公共子序列思路 本题与 1143. 最长公共子序列 的区别在于&#xff0c;1143中求的是两个序列中的最长公共子序列&#xff0c;而本题是要找到最少删除多少个元素后可以得…

PHP程序员适合创业吗?

创业是一件自然而然的事&#xff0c;不需要人为选择。 只要你是一个努力能干主动的人&#xff0c;当你在一个行业深耕5年之后&#xff0c;就会发现人生发展的下一步就是创业。当然如果行业合适的话。 什么叫行业合适呢&#xff1f; 就是创业的成本并不那么高&#xff0c;不需…

怎么在LinkedIn领英安全添加到3万个好友?

根据领英最新公布的数据&#xff1a;领英全球用户数已经达到8.3亿&#xff0c;超5800万个公司主页&#xff0c;可以说是世界上最-大的business database。 这就不难理解为什么越来越多的外贸人&#xff0c;开始认真尝试和重视在领英开发客户&#xff0c;因为领英确实是外贸人&a…

鸿蒙3.0 APP混合开发闪退问题笔记

APP采用cordova混合开发&#xff0c; 鸿蒙2.0以及安卓操作系统正常使用&#xff0c;但是在鸿蒙3.0中出现APP闪退&#xff0c;对APP进行真机调试发现&#xff0c;鸿蒙3.0系统对crosswork插件存在兼容问题&#xff0c;这些问题会导致APP页面加载失败&#xff0c;进而导致App闪退测…

扬帆优配|“涨停敢死队”慌了?监管“盯紧”异常交易

日前&#xff0c;沪深买卖所发布《主板股票反常买卖实时监控细则》&#xff0c;对反常买卖行为的类型和标准作出规则。其间&#xff0c;针对“打板”“封板”等反常行为的监控遭到商场重视&#xff0c;有商场传闻称&#xff0c;新规或导致高频买卖毁灭&#xff0c;“量价型股票…

什么蓝牙耳机打游戏好?打游戏好用的无线蓝牙耳机

午休或是周末约上好友玩两局游戏&#xff0c;是忙里偷闲的快乐时刻&#xff0c;对于普通游戏玩家&#xff0c;其实耳机够用就行&#xff0c;下面就分享几款打游戏好用的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝牙版本&#xff1a;5.3 推荐系数&#xff1a;五颗星 南卡小音舱li…

【代码随想录二刷】Day24-回溯-C++

代码随想录二刷Day24 今日任务 理论基础 77.组合 语言&#xff1a;C 理论基础 解决的问题 ① 组合问题&#xff1a;不考虑顺序 ② 切割问题 ③ 子集问题 ④ 排列问题&#xff1a;考虑顺序 ⑤ 棋盘问题&#xff1a;N皇后&#xff0c;解数独回溯法三部曲 ① 回溯函数模板返回…

ChatGPT来了,软件测试工程师距离失业还远吗?

小伙伴们前一段是不是都看到过ChatGPT的相关视频&#xff0c;那它到底是什么&#xff1f;对软件测试行业会有什么影响&#xff1f; 今天汇智妹就用一篇文章来给大家讲清楚。 一、ChatGPT是什么&#xff1f; 简单来说&#xff0c;ChatGPT是一款人工智能聊天机器人&#xff0c;…

【Spring中@Autowired和@Resource注解的区别?】

一.背景 Spring中Autowired和Resource注解的区别&#xff1f; Spring框架想必大家都知道吧&#xff0c;那么Spring中Autowired和Resource注解的区别你知道吗&#xff1f;如果不知道也不要紧&#xff0c;我们就一起来学习一起吧。 二.Autowired和Resource注解的区别&#xff1f…

【人工智能 AI 】您可以使用机器人流程自动化 (RPA) 实现自动化的 10 个业务流程:Robotic Process Automation (RPA)

摘:人类劳动正在被机器(例如在工业中)或计算机程序(适用于所有行业)所取代。 目录 10 processes you can robotise in your company您可以在公司中实现自动化的 10 个流程 Human employees or robotic workers?人类员工还是机器人工人? Robots take over headhunting…

【蓝桥杯每日一题】二分算法

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; 蓝桥杯 &#x1f319;我与杀戮之中绽放&#xff0c;亦如黎明的花…

乘上算力发展的东风,联想这次能否变革突起?

“逆水行舟&#xff0c;不进则退”笔者认为这句话也同样适用到现在的联想集团身上&#xff0c;近3年受到疫情的影响全球电子领域普遍不突出&#xff0c;智能手机出货量上涨乏力&#xff0c;个人电脑&#xff08;PC&#xff09;的销量也波动频繁&#xff0c;联想集团在这种不乐观…

外包整整干了一年,废了。。。

先说一下自己的个人情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了…