You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数字序列解码计数代码:0场景处理逻辑缺失排查求助

嘿,我来帮你搞定这个带0的解码计数问题!这类动态规划题的坑点几乎全在0的处理上,结合你的示例,先明确下解码规则(避免理解偏差):

  • 单个数字0-9:分别对应A-J,全部合法
  • 两位数字组合:仅10-25对应K-Z,合法(前导0的两位组合比如00、07都不合法)

接下来分析你的代码可能踩的坑,再给出正确实现:

常见错误点(针对含0场景)

  • 错误认为单个0不合法:很多人会受常规解码题(A=1,0不能单独解码)的影响,遇到0就跳过单个解码的情况,导致像"200"这种场景少算一种方式。
  • 允许前导0的两位组合:比如把00、07这类组合当成合法解码,导致"007"被错误统计为多种方式。
  • 初始条件错误:比如第一个字符是0时,错误地将dp[1]设为0,后续所有计算都会偏离。

正确的动态规划实现

def countValidSequences(input_num):
    n = len(input_num)
    if n == 0:
        return 0
    # dp[i]表示前i个字符的解码方式数
    dp = [0] * (n + 1)
    dp[0] = 1  # 空字符串有一种解码方式(基准条件)
    dp[1] = 1  # 单个字符(0-9)都合法,所以初始为1
    
    for i in range(2, n + 1):
        # 情况1:单独解码当前字符(第i个字符对应input_num[i-1])
        # 单个0-9都合法,所以直接加dp[i-1]
        dp[i] += dp[i-1]
        
        # 情况2:和前一个字符组成两位解码
        two_digit = int(input_num[i-2:i])
        # 仅当两位数字在10-25之间时才合法
        if 10 <= two_digit <= 25:
            dp[i] += dp[i-2]
    
    return dp[n]

验证示例

我们用你的三个测试用例验证:

  1. 输入"121":
    dp[0]=1, dp[1]=1
    i=2:dp[2] = dp[1] + dp[0](12合法)=1+1=2
    i=3:dp[3] = dp[2] + dp[1](21合法)=2+1=3 → 正确输出3
  2. 输入"200":
    dp[0]=1, dp[1]=1
    i=2:dp[2] = dp[1] + dp[0](20合法)=1+1=2
    i=3:dp[3] = dp[2] + 0(00不合法)=2 → 正确输出2
  3. 输入"007":
    dp[0]=1, dp[1]=1
    i=2:dp[2] = dp[1] + 0(00不合法)=1
    i=3:dp[3] = dp[2] +0(07不合法)=1 → 正确输出1

额外说明

如果你的规则中两位组合允许00-25(比如00对应AA),那只需要把两位判断改成0 <= two_digit <=25,但根据你的示例"007"仅有一种解码方式,显然规则是两位组合必须10-25,所以上面的代码完全匹配你的需求。

内容的提问来源于stack exchange,提问作者CodeQuestor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:42:39