题目描述:
将一个数字翻译为字符串,翻译规则为:0对应"a",1对应"b",……,25对应"z",计算一个数字有多少种不同的翻译方法。
思路解析:
- 动态规划方法:
- 定义状态:dp[i] 表示从第i位开始到末尾的数字有多少种翻译方式。
- 状态转移方程:
- 若num[i:i+2]在 [10, 25] 且num[i] != 0:dp[i] = dp[i+1] + dp[i+2]。
- 否则:dp[i] = dp[i+1]。
- 初始化:
- dp[n] = 1,空串有一种翻译方式。
- dp[n-1] = 1,最后一位数字的翻译方式为1。
- 目标:返回dp[0]。
题解:
以12258为例:
数字 -> 翻译组合
1 2 2 5 8 -> bccfi
1 22 5 8 -> bwfi
1 2 25 8 -> bczi
12 2 5 8 -> mcfi
12 25 8 -> mzi
代码详解:
逐步实现动态规划算法:
def solution(num):
num_str = str(num)
n = len(num_str)
dp = [0] * (n + 1)
dp[n] = 1
dp[n - 1] = 1
for i in range(n - 2, -1, -1):
if 10 <= int(num_str[i:i + 2]) <= 25:
dp[i] = dp[i + 1] + dp[i + 2]
else:
dp[i] = dp[i + 1]
return dp[0]
知识总结:
- 动态规划核心要点:
- 状态定义: 明确子问题(dp[i])如何拆解。
- 状态转移方程: 确定递推逻辑。
- 初始化: 边界情况必须合理。
- 字符串切片与整数转换:
- 使用num_str[i:i+2]快速取两位数,用int()转为整数判断范围。
- 数组反向迭代:
- 从后往前递推适用于需要依赖后续状态的动态规划问题。
学习建议:
对于动态规划的入门同学:
- 先从简单问题开始(如斐波那契数列)。
- 熟练掌握状态定义和状态转移方程。
学习计划:
结合豆包MarsCode AI刷题功能,我总结了以下高效刷题计划:
- 制定计划:
- 每天固定时间完成1-2道题,注重理解题目本质。
- 按主题学习:如连续刷3天动态规划题目,加深理解。
- 错题复盘:
- 将易错题收录到错题本,利用AI功能生成不同角度的解析。
- 再次尝试独立完成题目。
- 层次递进:
-
从基础题目入手(如斐波那契数列)。
-
按难度提升,逐步尝试更复杂的问题。
工具运用:
- 利用AI刷题功能:
- 代码纠错: 提交代码后让AI分析潜在错误。
- 多角度解析: AI提供多种解法(如递归、动态规划)。
- 结合其他资源:
- 对于不理解的概念,使用搜索引擎或教材补充理论知识。
- 对照LeetCode或其他题库中的题目,加深题型理解。
- 高效练习:
-
AI提供的代码优化建议可以减少不必要的复杂度。
-
善用AI的图解能力,将问题转化为可视化理解。
学习建议:
- 遇到不懂的地方,可以先试着查阅资料,然后再利用AI生成具体实现。
- 通过AI比较多种解法,找到更适合自己的思路。