青训营X豆包MarsCode 技术训练营第二课 | 豆包MarsCode AI 刷题

79 阅读2分钟

问题描述

小M获得了一个任务,需要将数字翻译成字符串。翻译规则是:0对应"a",1对应"b",依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的翻译方法。

例如:数字12258可以翻译成 "bccfi", "bwfi", "bczi", "mcfi" 和 "mzi",共5种方式。

测试样例

样例1:

输入:num = 12258

输出:5

样例二:

输入:num = 1400112

输出:6

样例三:

输入:num = 2110101

输出:10

样例四:

输入:num = 25

输出:2

样例五:

输入:num = 1023

输出:4

数字组合不同, 可能有不同方案, 例如当前是 2, 可能是单独 1 个 2, 也可能是和前面数字组成的 12 和 22。

解题思路

这里可以组成两位数的数字是有限制的,也就是最多有10——25这几个两位数。

所以我们可以定义 dp数组, dp[i]表示从左到右遍历到第 i 位数字时可以翻译成的字符串数目。

固定第 i 位数字后, 观察其前一位数字, 可以得到如下转移方程:

如果当前数字和前一位数字(如果存在的话)组成的两位数在 10 到 25 之间, 那么当前数字既可以独立使用, 也可以和之前数字合用, 所以 dp[i] = dpi-2 + dpi-1

如果当前数字无法和前一位数字组成有效的两位数, 意味着当前数字只能独立使用, 所以 dp[i] = dp[i-1]。 观察上述方程, 我们发现整个 dp 数组只用到了 i-2 和 i-1, 所以我们可以只使用两个变量, 定义上一个和当前的 dp 值, 这样既节省了空间, 又精简了代码。

注意需要先把输入的数字转换成字符串, 方便每一位的处理。

注意dp[i]初始化值都为 1, 因为至少可以转换成 1 个字符串。

算法步骤

1)将数字转换为字符串:将输入的数字转化为字符串可以方便我们逐位处理。

2)初始化dp数组:

3)转移:将当前字符与前一个字符组合起来翻译(10~25之间)。

最终代码

微信图片_20241115193812.png

运行结果

微信图片_20241115193920.png