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

47 阅读3分钟

问题重述

给定一个数字字符串,需要将该数字字符串翻译成由字母组成的字符串
其中每个数字(0-25)对应一个字母('a'-'z')。
一个数字字符串可能有多种翻译方法。
要求编写一个程序,计算并输出给定数字字符串的所有可能翻译方法的数量。

思路分析

很明显这个题应该去用动态规划去解决

  1. 动态规划数组

    • 创建一个长度为n+1的数组dp,其中n是输入字符串的长度。
    • dp[i]表示从字符串的开始到第i个字符(包括第i个字符)的子字符串可以翻译成的不同字符串的数量。
    • 初始化:dp[0] = 1dp[1] = 1
  2. 状态转移

    • 对于每个位置i(从2开始到n),有两种可能性:

      • 只考虑当前字符str_num[i-1]作为单独的数字进行翻译,此时dp[i] = dp[i-1]
      • 考虑当前字符和前一个字符str_num[i-2:i]组成的两位数(如果它们在10到25之间)进行翻译,此时dp[i] += dp[i-2]
    • 综合这两种情况,得到dp[i]的最终值。

代码分析

1.str_num = str(num):将输入的数字num转换为字符串str_num n = len(str_num):计算字符串str_num的长度,并将其存储在变量n中。

def solution(num):
    str_num = str(num)  # 将数字转成字符串
    n = len(str_num)  
  1. 基础情况处理:如果字符串长度为0(即空字符串),则返回0,因为没有翻译方法;如果字符串长度为1(即单个字符),则返回1,因为单个字符有一种翻译方法。
if n == 0:
        return 0
    if n == 1:
        return 1  # 单字符的情况

3.动态规划数组的初始化和状态转化
dp = [0] * (n + 1):初始化一个长度为n+1的动态规划数组dp,所有元素初始值为0。
dp[0] = 1:设置dp[0]为1,这主要是为了递归方便
dp[1] = 1:设置dp[1]为1,表示单个字符有一种翻译方法。

dp[i] = dp[i - 1]:首先,假设当前字符只能单独翻译,因此dp[i]的值至少等于dp[i-1]。 然后,检查当前字符和前一个字符组成的两位数two_digit是否在10到25之间。如果是,说明这两个字符可以组合翻译成一个字母,因此dp[i]需要加上dp[i-2]的值(表示到前一个字符为止的翻译方法数量)。

# 动态规划数组
    dp = [0] * (n + 1)
    dp[0] = 1  # 空字符串一种方式(这里主要是为了递归方便,实际上在求解过程中不会用到dp[0])
    dp[1] = 1  # 一个字符也有一种方式
    for i in range(2, n + 1):
        # 只翻译当前字符
        dp[i] = dp[i - 1]
 
        # 结合前一个字符一起翻译
        two_digit = int(str_num[i - 2:i])  # 当前字符及前一个字符形成的数
        if 10 <= two_digit <= 25:
            dp[i] += dp[i - 2]  # 如果能够组合翻译
    return dp[n]  # 返回总的翻译方式

总结

采用动态规划方法,通过遍历字符串并考虑单个字符和相邻两个字符的翻译情况,最终返回总的翻译方式数量。