青训营X豆包MarsCode技术训练营伴学笔记(6)|数字翻译成字符串的可能性|豆包MarsCode AI刷题

82 阅读4分钟

一、题目解析

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

二、知识总结

  • 动态规划核心:分解问题,将复杂问题转化为多个子问题求解。状态转移公式的推导是解题关键。

  • 适用场景

    • 子问题之间存在依赖关系,例如翻译规则中的单字符与双字符。
    • 求解最优解或统计数量,例如本题中统计翻译方式。
  • 我的理解

    • 动态规划的难点是状态定义和转移方程的设计,需要从题目规则出发进行拆解。
  • 学习建议

    • 对于初学者,建议从简单的动态规划题目入手,如爬楼梯问题,逐步理解递归与动态规划的联系。
    • 梳理常见的动态规划问题模板,练习将问题分解成子问题。

三、学习计划

  1. 刷题计划

    • 分类练习:动态规划可以分为路径问题、序列问题等,每类至少刷 5-10 道经典题目。
    • 逐步进阶:从基础题(如斐波那契数列)到复杂题(如字符串处理问题)。
    • 专项复盘:每周总结做错的题目,梳理错误原因,补足知识盲点。
  2. 错题复盘

    • 错因分析:记录动态规划中的哪些步骤出错(如状态定义、初始条件)。
    • 优化练习:重新设计代码,通过手写推导验证逻辑正确性。
  3. 结合题目模板

    • 将常用的动态规划模板总结为代码片段,方便快速应用。

四、工具运用

  1. AI 刷题功能

    • 推荐功能:利用 AI 的个性化推荐机制找到类似动态规划的题目,集中攻克难点。
    • 代码优化:AI 可协助优化代码逻辑、降低复杂度,帮助学习高效的解题技巧。
    • 错题解析:通过 AI 自动生成详细解析,清晰了解问题的关键点。
  2. 其他资源结合

    • 在线编程平台:结合豆包MarsCode AI等平台练习,借助测试样例验证代码的健壮性。
    • 笔记工具:使用工具整理学习记录,将动态规划的知识点、解题步骤等系统化归纳。
    • 可视化工具:通过可视化工具(如算法图解)理解动态规划的递推过程。