一、题目解析
1. 问题描述
小M获得了一个任务,需要将数字翻译成字符串。翻译规则是:0对应"a",1对应"b",依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的翻译方法。
例如:数字12258可以翻译成 "bccfi", "bwfi", "bczi", "mcfi" 和 "mzi",共5种方式。
测试样例
样例1:
输入:
num = 12258
输出:5
样例2:
输入:
num = 1400112
输出:6
样例3:
输入:
num = 2110101
输出:10
样例4:
输入:
num = 25
输出:2
样例5:
输入:
num = 1023
输出:4
2. 题目解析
这道题是动态规划的经典应用,适用于处理字符串的分段决策问题。题目要求将数字翻译为字符串,并统计不同的翻译方式数量。
(1)分析翻译规则
-
单字符:每个数字(
0-9)可以直接对应一个字母。 -
双字符:两位数在
10-25范围内可以组合成一个字母。
(2)动态规划状态转移
- 定义状态
dp[i]表示前i位数字的翻译方法总数。 - 转移公式:
如果当前字符可单独翻译,则
dp[i] += dp[i-1];如果当前两字符可组合翻译,则dp[i] += dp[i-2]。 - 初始化:空字符串
dp[0] = 1,单字符dp[1] = 1。
(3)递推过程
- 通过遍历字符串逐步更新
dp数组。 - 最终答案为
dp[len(s)]。
3. 代码详解
def solution(num: int) -> int:
s = str(num) # 将数字转换为字符串便于处理
n = len(s)
# dp[i] 表示从第 i 位到末尾有多少种翻译方式
dp = [0] * (n + 1)
dp[n] = 1 # 末尾没有数字,只有1种翻译方式
for i in range(n - 1, -1, -1):
dp[i] = dp[i + 1] # 单独翻译这一位
# 如果第 i 和第 i+1 位可以组成有效的两位数
if i < n - 1 and "10" <= s[i:i+2] <= "25":
dp[i] += dp[i + 2]
return dp[0] # dp[0] 就是从头开始有多少种翻译方式
4. 时间和空间复杂度分析
(1)时间复杂度: 𝑂(𝑛) -- 需要遍历一次字符串,单次判断或计算均为常数时间。
(2)空间复杂度: 𝑂(𝑛) -- 维护了一个长度为 𝑛+1 的动态规划数组。
5.代码优化
可以使用两个变量代替 dp 数组,优化空间复杂度至 𝑂(1)。
优化代码如下:
def solution(num: int) -> int:
s = str(num)
prev, curr = 1, 1 # dp[i-2], dp[i-1]
for i in range(2, len(s) + 1):
temp = curr
if 10 <= int(s[i-2:i]) <= 25:
temp += prev
prev, curr = curr, temp
return curr
二、知识总结
-
动态规划核心:分解问题,将复杂问题转化为多个子问题求解。状态转移公式的推导是解题关键。
-
适用场景:
- 子问题之间存在依赖关系,例如翻译规则中的单字符与双字符。
- 求解最优解或统计数量,例如本题中统计翻译方式。
-
我的理解:
- 动态规划的难点是状态定义和转移方程的设计,需要从题目规则出发进行拆解。
-
学习建议:
- 对于初学者,建议从简单的动态规划题目入手,如爬楼梯问题,逐步理解递归与动态规划的联系。
- 梳理常见的动态规划问题模板,练习将问题分解成子问题。
三、学习计划
-
刷题计划:
- 分类练习:动态规划可以分为路径问题、序列问题等,每类至少刷 5-10 道经典题目。
- 逐步进阶:从基础题(如斐波那契数列)到复杂题(如字符串处理问题)。
- 专项复盘:每周总结做错的题目,梳理错误原因,补足知识盲点。
-
错题复盘:
- 错因分析:记录动态规划中的哪些步骤出错(如状态定义、初始条件)。
- 优化练习:重新设计代码,通过手写推导验证逻辑正确性。
-
结合题目模板:
- 将常用的动态规划模板总结为代码片段,方便快速应用。
四、工具运用
-
AI 刷题功能:
- 推荐功能:利用 AI 的个性化推荐机制找到类似动态规划的题目,集中攻克难点。
- 代码优化:AI 可协助优化代码逻辑、降低复杂度,帮助学习高效的解题技巧。
- 错题解析:通过 AI 自动生成详细解析,清晰了解问题的关键点。
-
其他资源结合:
- 在线编程平台:结合豆包MarsCode AI等平台练习,借助测试样例验证代码的健壮性。
- 笔记工具:使用工具整理学习记录,将动态规划的知识点、解题步骤等系统化归纳。
- 可视化工具:通过可视化工具(如算法图解)理解动态规划的递推过程。