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

回文子串计数问题:动态规划解法错误排查求助

问题分析与解决

你的代码返回结果错误的核心原因是DP数组的遍历顺序不正确:当前你按i从左到右递增的顺序遍历,当计算较长子串的dp[i][j]时,依赖的内部子串状态dp[i+1][j-1]还未被计算(因为i+1对应的循环还没执行),仍保持初始的False,导致部分回文子串被漏判。

以输入"aaa"为例,当i=0、j=2时,dp[1][1]还没被赋值(i=1的循环在i=0之后执行),所以dp[i+1][j-1]为False,最终dp[0][2]被错误判定为False,漏掉了这个长度为3的回文子串,导致结果少1。

修正方案一:逆序遍历i

将i从字符串末尾开始向前遍历,这样当处理i时,i+1对应的所有dp状态已经计算完成,依赖的dp[i+1][j-1]能取到正确值:

def palindromic_substrings(s):
    result = 0
    n = len(s)
    dp = [[False] * n for _ in range(n)]

    # 从后往前遍历i
    for i in range(n-1, -1, -1):
        for j in range(i, n):
            # 判断s[i..j]是否为回文
            dp[i][j] = (j - i <= 1) or (s[i] == s[j] and dp[i+1][j-1])
            if dp[i][j]:
                result += 1
  
    return result

print(palindromic_substrings("aaa")) # 返回6,正确

修正方案二:按子串长度从小到大遍历

先处理所有长度为1的子串,再处理长度为2的,最后处理长度≥3的子串,确保计算长串时,内部的短串状态已经确定:

def palindromic_substrings(s):
    result = 0
    n = len(s)
    dp = [[False] * n for _ in range(n)]

    # 处理长度为1的子串
    for i in range(n):
        dp[i][i] = True
        result += 1

    # 处理长度为2的子串
    for i in range(n-1):
        if s[i] == s[i+1]:
            dp[i][i+1] = True
            result += 1

    # 处理长度≥3的子串
    for length in range(3, n+1):
        for i in range(n - length + 1):
            j = i + length - 1
            if s[i] == s[j] and dp[i+1][j-1]:
                dp[i][j] = True
                result += 1
  
    return result

print(palindromic_substrings("aaa")) # 返回6,正确

额外说明

你的dp[i][j]定义实际对应闭区间子串s[i..j](包含索引i和j的字符),而非你描述的s[i:j](Python切片左闭右开,对应s[i]到s[j-1]),这个定义上的混淆需要注意,避免后续逻辑出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:15:42