数字序列解码计数代码: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]
验证示例
我们用你的三个测试用例验证:
- 输入"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 - 输入"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 - 输入"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
相关产品推荐
相关产品推荐

