剑指 Offer(第2版)面试题 46:把数字翻译成字符串

Python版剑指Offer题解 Python版剑指Offer题解 本题解配合leetcode中剑指Offer刷题使用 参考链接:图解算法数据结构 文章目录剑指 Offer 03. 数组中重复的数字剑指 Offer 04. 二维数组中的查找剑指 Offer 05. 替换空格剑指 Offer 06. 从尾到头打印链表剑指 Offer 07. 重建二叉树剑指 Offer 09. 用两个栈实现队列剑指 Offer 10- I. 斐波那契数列剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 11. 旋转数组的最小数字剑指 Offe 阅读详情

剑指 Offer(第2版)面试题 46:把数字翻译成字符串

题目来源:59. 把数字翻译成字符串

解法1:动态规划

还记得经典的爬楼梯(斐波那契数列)吗?

每次可以走 1 步或者 2 步,问 n 个台阶一共有多少种爬楼梯的方法?

我们不需要思考就能写出状态转移方程:dp[i] = dp[i-1] + dp[i-2]。

这道题相当于加了一些限制条件,并且倒着推更便于理解。

设 dp[i] 表示从字符串的第 i 位开始到末尾,最大的翻译方法个数。

初始化 dp[n] = 1,dp[n - 1] = 1。

状态转移:

  1. dp[i] = dp[i + 1],先假设 s[i] 只有一种翻译方法,此时翻译方法保持不变。
  2. 如果 s[i] 和 s[i+1] 能够翻译成一个字母,则 dp[i] 的翻译方法可以加上 dp[i+2] 的值。

举例:

假设数字为 12xxxxxx,此时考虑到 1,有 2 种情况:

  1. 1 作为单独的一个数看,翻译方法数和 2xxxxxx 相同.
  2. 12 作为一个整体看,翻译方法数和 xxxxxx 相同。

代码:

class Solution
{
public:
	int getTranslationCount(string s)
	{
		if (s.empty())
			return 0;
		int n = s.size();
		if (n == 1)
			return 1;
		vector<int> dp(n + 1, 0);
		// 初始化
		dp[n] = dp[n - 1] = 1;
		// 状态转移
		for (int i = n - 2; i >= 0; i--)
		{
			dp[i] = dp[i + 1];
			if (s[i] == '1' || (s[i] == '2' && s[i + 1] >= '0' && s[i + 1] <= '5'))
				dp[i] += dp[i + 2];
		}
		return dp[0];
	}
};

复杂度分析:

时间复杂度:O(n),其中 n 是字符串 s 的长度。

空间复杂度:O(n),其中 n 是字符串 s 的长度。

我们发现 dp[i] 的值只与 dp[i+1] 和 dp[i+2] 有关,可以状态压缩:

class Solution
{
public:
	int getTranslationCount(string s)
	{
		if (s.empty())
			return 0;
		int n = s.size();
		if (n == 1)
			return 1;
		// vector<int> dp(n + 1, 0);
		// 初始化
		// dp[n] = dp[n - 1] = 1;
		int cur = 0, pre1 = 1, pre2 = 1;
		// 状态转移
		for (int i = n - 2; i >= 0; i--)
		{
			// dp[i] = dp[i + 1];
			cur = pre1;
			if (s[i] == '1' || (s[i] == '2' && s[i + 1] >= '0' && s[i + 1] <= '5'))
			{
			    // dp[i] += dp[i + 2];
			    cur += pre2;
			}
			pre2 = pre1;
			pre1 = cur;
		}
		return cur;
	}
};

还可以顺着进行动态规划:

class Solution
{
public:
    int getTranslationCount(string s)
    {
        if (s.empty())
			return 0;
		int n = s.size();
		if (n == 1)
			return 1;
		vector<int> dp(n + 1, 0);
		// 初始化
		dp[0] = dp[1] = 1;
		// 状态转移
		for (int i = 2; i <= n; i++)
		{
		    dp[i] = dp[i - 1];
		    if (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] >= '0' && s[i - 1] <= '5'))
		        dp[i] += dp[i - 2];
		}
		return dp[n];
    }
};

类似题:LeetCode 91. 解码方法

链接:91. 解码方法

从 1 编码到 26,这里 0 是非法字符!

代码:

// 顺推动态规划

class Solution
{
public:
    int numDecodings(string s)
    {
        // 特判(s 只包含数字,并且可能包含前导零)
        if (s.empty() || s[0] == '0')
            return 0;
        if (s.size() == 1)
            return 1;
        int n = s.size(), pre = s[0] - '0';
        // 状态矩阵,并初始化(每个数字均可映射成一个字母)
        vector<int> dp(n + 1, 1);
        // 状态转移
        for (int i = 2; i <= n; i++)
        {
            int cur = s[i - 1] - '0';
            if (cur == 0 && (pre != 1 && pre != 2))
                return 0;
            if (pre == 1 || (pre == 2 && cur <= 6)) // 当前数字为 10~26
            {
                if (cur != 0) // cur 不为 0,则当前数字可以拆分,方法数累加
                    dp[i] = dp[i - 2] + dp[i - 1];
                else // 当前数字为 10或 20,不可拆分,只有一种映射,解码方法不增加
                    dp[i] = dp[i - 2];
            }
            else // 当前数字为1~9,只有一种映射,解码方法不增加
                dp[i] = dp[i - 1];
            pre = cur;
        }
        return dp[n];
    }
};

倒推会出现问题,这道题并不保证任何数字都可以翻译成字符串。

简化:

// 简化

class Solution
{
public:
    int numDecodings(string s)
    {
        // 特判(s 只包含数字,并且可能包含前导零)
        if (s.empty() || s[0] == '0')
            return 0;
        if (s.size() == 1)
            return 1;
        int n = s.size();
        s = " " + s;
        vector<int> dp(n + 1, 0);
        dp[0] = 1;
        for (int i = 1; i <= n; i++)
        {
            int a = s[i] - '0', b = (s[i - 1] - '0') * 10 + s[i] - '0';
            if (a >= 1 && a <= 9)
                dp[i] = dp[i - 1];
            if (b >= 10 && b <= 26)
                dp[i] += dp[i - 2];
        }
        return dp[n];
    }
};

复杂度分析:

时间复杂度:O(n),其中 n 是字符串 s 的长度。

空间复杂度:O(n),其中 n 是字符串 s 的长度。

十一、学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现) 学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现) 阅读详情

相关推荐

从M350 RTK到E-Port:解锁大疆无人机多负载协同与PSDK V3开发新范式

本文深入解析了大疆M350 RTK无人机搭载的E-Port智能接口与全新的PSDK V3开发套件,如何共同实现多负载协同作业的范式转变。E-Port集成了供电与高速数据总线,而PSDK V3通过统一的设备模型与服务机制,大幅降低了第三方负载的开发门槛与集成复杂度,使构建如智能巡检等复杂空中作业系统变得更加高效和标准化。

3c4x5z6v7b的博客 166

剑指 Offer 46. 把数字翻译成字符串(动态规划)1

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 解法一: class Solution { public int translateNum(int

秋雨行舟 522

DDR4协议规范之(一)DDR4结构和寻址

DDR4 SDRAM结构和寻址DDR4 SDRAM的封装和寻址新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 DDR4 SDRAM的封装和寻址 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习

YJFeiii的博客 3万+

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

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

kashine的博客 201

风光储互补微电网在偏远地区的应用实践:从建模到仿真全解析

本文深入解析了风光储互补微电网在偏远地区的应用实践,从系统设计到仿真建模全流程。通过Simulink等工具进行动态仿真,验证了系统在多种工况下的可靠性,并结合实际案例展示了其显著的经济和环保效益。文章为从业者提供了从技术路径到实施优化的全面指导。

weixin_29047545的博客 268

固定时间收敛的控制器设计(基础知识)

针对控制系统的有限时间收敛和固定时间收敛给出一些常用定理。

qq_40241332的博客 1万+

剑指Offer(第二版): 46. 把数字翻译成字符串(动态规划) 48. 最长不含重复字符的子字符串 26. 树的子结构 07. 重建二叉树 36. 二叉搜索树与双向链表

/** 解题思路:动态规划 1、首先考虑转移方程 if xi + xi-1 不能组成一个数,则dp[i] = dp[i-1] if xi + xi-1 能责成一个数,则dp[i] = dp[i-1] + dp[i-2] 2、考虑边界方程 首先 dp[1] =1 , 而 dp[2] = 1+1 =2 ,则 反推可以知道 dp[0] = 1; 3、那怎么知道xi和xi-1能不能组成一个数呢,因为ASCII是 0~25,因此01,.

置身于量子事业的软件开发爱好者 683

手把手教你用Origin拟合真应力-真应变曲线:从数据到加工硬化指数n的完整流程

本文详细解析了如何使用Origin软件拟合真应力-真应变曲线并计算加工硬化指数n的全流程。从数据预处理、曲线绘制到Hollomon方程拟合,逐步指导材料科学研究人员完成实验数据分析,帮助准确评估金属材料的力学性能与强化特性。

view3的博客 708

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

除了使用一直除外,还可以使用s.substring(i-2,i)和compareTo()来比较是否大于等于"10"和小于等于"25"就可以了。当发现有两种操作方法,说明当前方法出错误了,必须立即想别的办法!假设3个数,第一个第二个可以组,第二个第三个可以组。123 && 字母3 && 1字母。

MengyuyangEddy的博客 265

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

医疗工具识别(手术器械计数):基于YOLOv8的智能手术器械管理系统

YOLOv8是Ultralytics公司于2023年推出的最新一代目标检测算法,相比前代YOLOv5,在精度和速度上都有显著提升。Anchor-free检测:不再使用预定义的anchor boxes,简化了检测流程更高效的骨干网络:采用CSPDarknet53作为特征提取网络多尺度特征融合:通过PANet结构实现更好的小目标检测损失函数优化:使用CIoU损失提高边界框回归精度YOLOv8提供了多种规模的模型(n/s/m/l/x),可根据实际需求在精度和速度之间进行权衡。

YOLO 480

(10/31)剑指 Offer: 46&48.动态规划(中等)

动态规划,剑指offer46题.把数字翻译成字符串&48题.最长不含重复字符的子字符串

weixin_57612827的博客 187

推荐一个直接用于项目开发的PID库!很好用,很稳定

关注、星标公众号,不错过精彩内容大家好,我是小麦。最近有朋友问到有没有现成的C语言PID库。当然有了!现在我就准备给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的PID示例,或者...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 9022

Leetcode刷题:剑指offer【面试题46 把数字翻译成字符串】

【面试题46 把数字翻译成字符串】 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 Leetcode题目对应位置: 面试题46:把数字翻译成字符串 思路:动态规划问题。 观察发现,不断扩展一个数字串时,如果新添加的数字和前一位数字不能合并为一个可转化为字符的两位数,那么新添加的数字对整体能够实现的翻译数量并没有贡献。 比如 “

学习 & 分享 ~ 460

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

剑指 Offer 46. 把数字翻译成字符串 【 c++/java详细题解 】

1、题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 提示: 0 <= num < 2^31 2、思路 (动态规划) O(logn)O(log

林深不见鹿 的博客 3336

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【LeetCode & 剑指offer刷题】动态规划与贪婪法题3:剑指Offer-46:把数字翻译成字符串...

【LeetCode &amp; 剑指offer刷题】动态规划与贪婪法题3:剑指Offer-46:把数字翻译成字符串 【LeetCode &amp; 剑指offer 刷题笔记】目录(持续更新中...) 剑指Offer-46:把数字翻译成字符串 题目: 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,……,11翻译成...

技术改变世界 983

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++:剑指Offer第二版46题:把数字翻译成字符串

剑指Offer第二版46题:把数字翻译成字符串原题链接地址新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 原题链接地址 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown

weixin_42329812的博客 356

leetcode 剑指offer-46.把数字翻译成字符串

原题如下: https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 2020年6月9日 每日一题 题解 方法一: 当我们考虑单个数字的时候,就只有一种翻译的结果,重要的是,我们遇到连续两个字母也可以翻译成字母,那么我们不妨建立一个数组ans[l+1],l为数字长度,来记录前n位的数字可以组成的答案种类,数组长度为数字长度多1,很明显ans[0]=ans[1]=1;我们从ans[2]来开始考虑,其实也是考虑一般状况下

zhuruihe2014的博客 250

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

剑指 Offer 46 把数字翻译成字符串 题目链接 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 典型的 DP~ 我们用 dp[i]dp[i]dp[i] 记录前 iii 个数的最多翻译方法,对当前位置 iii,有如下的状态转移方程: dp[i]+=dp[i−1]dp[i]+=

旺崽的博客 2594

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

点击做题 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 解题思路 class Solution { public int translateNum(int num) { String s = String.valueOf(num); // 0 ~ 25

瑞新の博客:bennyrhys 2320

【剑指Offer】个人学习笔记_46_把数字翻译成字符串

目录题目:[剑指 Offer 46. 把数字翻译成字符串](https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/)题目分析初始解答:学习他人:方法一:方法二:方法三:方法四:总结 刷题日期:下午7:13 2021年5月11日星期二 个人刷题记录,代码收集,来源皆为leetcode 经过多方讨论和请教,现在打算往Java方向发力 主要答题语言为Java 题目: 剑指 Offer 46. 把数字翻译成字符串 难度中

苏柒的博客 453

每日一题 - 剑指 Offer 46. 把数字翻译成字符串

每日一题 - 剑指 Offer 46. 把数字翻译成字符串 题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 难易程度:中等 题目描述: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分

一只小菜鸡的博客 312

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

剑指 Offer 46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: 12258有5种不同的翻译,分别是"bccfi", "bw...

Lucky小黄人的博客 150

剑指offer面试题46(java版):把数字翻译成字符串

welcome to my blog 剑指offer面试题46(java版):把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。 示例 1: 输入: 12258 输出: 5 解释: ...

littlehaes的博客 607

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

剑指 Offer 46. 把数字翻译成字符串 写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点 1.动态规划 解题步骤 class Solution { public: int translateNum(int num) { string s=to_string(num); vector<int>ans; ans.push_back(1);//根据推算得来的,举例子 ans.pus

y152543654的博客 217
上一篇: 剑指 Offer(第2版)面试题 45:把数组排成最小的数
下一篇: 剑指 Offer(第2版)面试题 48:最长不含重复字符的子字符串
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值