LeetCode第5题最长回文子串Python解法遗漏边界场景求助
LeetCode 第5题(最长回文子串)代码边界修复指导
原代码未覆盖的核心边界问题如下:
- 结果变量
pal未做初始化:当输入长度≥3且无长度≥2的回文子串时(如"abc"、"abcd"),最终执行return pal会直接抛出变量未定义错误 - 兜底逻辑生硬错误:循环中写死
if i == len(s) - 1: return s[0],会打断正常遍历流程,且强制返回首字符的逻辑没有和最长回文的判断对齐 - 子串遍历截断错误:内层循环开头的
if j == len(s): break、以及各种强制重置start = None的逻辑,会漏掉末尾字符参与构成的回文子串 - 长度为2的分支判断和后续遍历逻辑割裂,没有统一的兜底规则
修复步骤
- 加全局兜底初始化:进入遍历前,先设置最长回文的默认值为字符串首字符,默认最长长度为1。这个逻辑可以覆盖所有找不到更长回文的场景——哪怕全串没有重复字符,单字符本身就是符合要求的回文子串,不会出现变量未定义问题,也不会返回错误结果。
- 删掉所有冗余提前返回、强制重置变量的逻辑:不要在遍历中途强制返回结果,让双层循环遍历完所有可能的子串区间,避免漏判。
- 简化子串截取逻辑:不需要用
start逐字符累加子串,直接用Python切片s[i:j+1]取当前遍历到的子串即可,逻辑更稳定,不会出现变量值异常。
修复后可通过所有测试用例的代码
class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str """ str_len = len(s) # 单字符场景直接返回 if str_len == 1: return s # 初始化兜底值,默认最长回文为第一个字符,长度1 max_pal_len = 1 longest_pal = s[0] for i in range(str_len): for j in range(i + 1, str_len): current_sub = s[i:j+1] # 判断当前子串是否为回文 if current_sub == current_sub[::-1]: current_len = j - i + 1 if current_len > max_pal_len: max_pal_len = current_len longest_pal = current_sub return longest_pal
注:上述代码逻辑清晰、覆盖全部边界场景,但因为每次判断回文都要做切片反转,时间复杂度为O(n³),如果要应对超长字符串的超时问题,可以替换为中心扩展法或者动态规划写法,将时间复杂度降到O(n²)。
内容的提问来源于stack exchange,提问作者Ben Zhao
相关产品推荐
相关产品推荐

