回文子串计数问题:动态规划解法错误排查求助
问题分析与解决
你的代码返回结果错误的核心原因是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
相关产品推荐
相关产品推荐

