翻译数字成字符串的可能性 | 豆包MarsCode AI刷题

65 阅读3分钟

题目描述:

将一个数字翻译为字符串,翻译规则为:0对应"a",1对应"b",……,25对应"z",计算一个数字有多少种不同的翻译方法。

思路解析:

  1. 动态规划方法:
  • 定义状态: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]

知识总结:

  1. 动态规划核心要点:
  • 状态定义:  明确子问题(dp[i])如何拆解。
  • 状态转移方程:  确定递推逻辑。
  • 初始化:  边界情况必须合理。
  1. 字符串切片与整数转换:
  • 使用num_str[i:i+2]快速取两位数,用int()转为整数判断范围。
  1. 数组反向迭代:
  • 从后往前递推适用于需要依赖后续状态的动态规划问题。

学习建议:

对于动态规划的入门同学:

  • 先从简单问题开始(如斐波那契数列)。
  • 熟练掌握状态定义状态转移方程

学习计划:

结合豆包MarsCode AI刷题功能,我总结了以下高效刷题计划:

  1. 制定计划:
  • 每天固定时间完成1-2道题,注重理解题目本质。
  • 按主题学习:如连续刷3天动态规划题目,加深理解。
  1. 错题复盘:
  • 将易错题收录到错题本,利用AI功能生成不同角度的解析。
  • 再次尝试独立完成题目。
  1. 层次递进:
  • 从基础题目入手(如斐波那契数列)。

  • 按难度提升,逐步尝试更复杂的问题。

工具运用:

  1. 利用AI刷题功能:
  • 代码纠错:  提交代码后让AI分析潜在错误。
  • 多角度解析:  AI提供多种解法(如递归、动态规划)。
  1. 结合其他资源:
  • 对于不理解的概念,使用搜索引擎或教材补充理论知识。
  • 对照LeetCode或其他题库中的题目,加深题型理解。
  1. 高效练习:
  • AI提供的代码优化建议可以减少不必要的复杂度。

  • 善用AI的图解能力,将问题转化为可视化理解。

学习建议:

  • 遇到不懂的地方,可以先试着查阅资料,然后再利用AI生成具体实现。
  • 通过AI比较多种解法,找到更适合自己的思路。