字符串翻译的动态规划 | 豆包MarsCode AI刷题

65 阅读3分钟

一、整体思路

这段代码实现了一个基于动态规划的算法,用于计算一个数字字符串所代表的数字有多少种不同的翻译方式。其核心思路是从数字字符串的末尾开始向前遍历,逐步计算每个位置到末尾的翻译方式数量。

二、代码结构分析

  1. 函数solution内部

    • 字符串转换和长度计算

      • 首先,s = str(num)将输入的整数num转换为字符串,这使得可以方便地对数字的每一位进行操作。n = len(s)获取了字符串的长度,这个长度信息在后续的遍历中起到重要作用。
    • 动态规划数组初始化

      • 创建了动态规划数组dpdp = [0] * (n + 1),这里dp[i]表示从第i个数字(从左到右,索引从 0 开始)到字符串末尾的翻译方式数量。初始化dp[n] = 1,这是因为空字符串有一种(空的)翻译方式,它作为动态规划的边界条件。
    • 动态规划计算

      • 通过for循环for i in range(n - 1, -1, -1)从后向前遍历数字字符串。在每次循环中,首先dp[i] = dp[i + 1],这表示每个数字都可以单独翻译,所以当前位置的翻译方式数量至少等于下一个位置的翻译方式数量。
      • 然后,if i < n - 1判断是否可以取两个数字。如果可以,two_digit = int(s[i:i + 2])将当前位置和下一个位置的字符转换为整数(形成一个两位数)。如果这个两位数在1025之间(if 10 <= two_digit <= 25),根据翻译规则,当前位置的翻译方式数量要加上从i + 2位置到末尾的翻译方式数量,即dp[i] += dp[i + 2]
  2. __main__部分
    这里对solution函数进行了简单的测试,使用print语句输出了三个测试用例的结果,检查solution函数计算的翻译方式数量是否符合预期。例如print(solution(12258) == 5)等,通过比较函数返回值和预期值是否相等来验证函数的正确性。

三、知识点

  1. 动态规划

    • 这是代码的核心知识点。动态规划通过存储子问题的解来避免重复计算,在这个程序中,dp数组存储了从每个位置到字符串末尾的翻译方式数量。通过从后向前填充dp数组,利用已经计算出的子问题的解(dp[i + 1]dp[i + 2])来计算当前问题的解。
  2. 字符串操作

    • 将整数转换为字符串,方便了对数字每一位的访问和处理。通过字符串切片s[i:i + 2]获取连续的两个字符,这是构建两位数的关键操作。
  3. 整数范围判断

    • 使用if 10 <= two_digit <= 25判断形成的两位数是否在合法的翻译范围内,这是根据题目给定的翻译规则进行的条件判断,决定了是否要增加当前位置的翻译方式数量。
  4. 函数定义和测试

    • 定义了solution函数来实现核心功能,并且在__main__部分通过简单的print语句对函数进行测试,这种方式有助于快速验证函数的正确性,是基本的编程实践方法。