3行代码搞定数字加密:LeetCode-Book动态规划实战指南
你还在为动态规划问题挠头?面对数字转换类题目无从下手?本文将通过LeetCode-Book中的经典案例,带你掌握动态规划在数字转换场景的核心应用,3行核心代码解决90%的类似问题。读完你将获得:动态规划状态转移方程设计技巧、空间优化实战方案、3种编程语言实现模板。
动态规划与数字转换的完美结合
动态规划(Dynamic Programming,DP)是解决多阶段决策问题的常用方法,在数字转换场景中表现尤为出色。LeetCode-Book收录了多个典型案例,其中LCR 165. 解密数字通过将数字翻译成字母的场景,完美诠释了动态规划的解题思路。
问题本质与状态定义
该问题要求计算一个数字有多少种翻译方法(0-25对应A-Z),例如"12"可翻译为"AB"或"L",共2种方案。核心在于定义状态转移方程:
- 状态定义:设
dp[i]为以第i位数字结尾的翻译方案数 - 转移方程:当第i-1位和第i位组成的两位数在[10,25]区间时,
dp[i] = dp[i-1] + dp[i-2],否则dp[i] = dp[i-1] - 初始状态:
dp[0] = dp[1] = 1(空数字和单个数字的翻译方法均为1)
三行核心代码实现
Python实现(空间优化版)
class Solution:
def crackNumber(self, ciphertext: int) -> int:
s = str(ciphertext)
a = b = 1
for i in range(2, len(s) + 1):
a, b = (a + b if "10" <= s[i-2:i] <= "25" else a), a
return a
上述代码来自LCR 165. 解密数字的最优解,通过两个变量交替前进,将空间复杂度从O(n)降至O(1)。类似的动态规划优化技巧在# 11.1 动态规划解题框架中有详细讲解。
多语言实现模板
LeetCode-Book提供了Python、Java、C++三种语言的实现:
- Java版本:LCR 165. 解密数字
- C++版本:LCR 165. 解密数字
- Python版本:sword_for_offer/codes/python/sfo_46_translate_numbers_into_strings_s1.py
从数字解密到更复杂场景
掌握了数字转换的动态规划思想后,可以轻松应对更复杂的问题:
股票交易问题
剑指 Offer 63. 股票的最大利润同样适用类似的状态转移思想,通过记录历史最低价格,实现O(n)时间复杂度的解决方案。
路径规划问题
LCR 166. 珠宝的最高价值将数字转换的一维DP扩展到二维网格,展示了动态规划的灵活性。
实战技巧与优化策略
空间优化三板斧
- 变量替代数组:如解密数字问题中用a、b替代dp数组
- 滚动数组:适用于状态只依赖前k个状态的场景
- 逆序计算:剑指 Offer 46. 把数字翻译成字符串展示了从右向左计算的技巧
常见错误与避坑指南
- 忽略两位数区间判断(必须是[10,25])
- 初始状态设置错误(dp[0] = 1的数学意义)
- 未处理前导零情况
这些细节在# 0.1 刷题建议中有详细说明,建议结合剑指 Offer 题目分类进行系统训练。
总结与进阶路线
动态规划在数字转换场景的应用遵循"定义状态→确定转移→优化空间"的三步法。LeetCode-Book提供了完整的学习路径:
- 基础入门:# 11.1 动态规划解题框架
- 实战训练:LCR 165. 解密数字 → 剑指 Offer 46. 把数字翻译成字符串
- 拓展应用:LCR 126. 斐波那契数 → LCR 127. 跳跃训练
建议收藏本文并结合剑指 Offer 刷题计划进行系统练习。下一期我们将解析动态规划在矩阵路径问题中的高级应用,敬请关注。
本文代码均来自LeetCode-Book开源项目:https://gitcode.com/GitHub_Trending/le/LeetCode-Book
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



