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

LeetCode #5最长回文子串代码出现UnboundLocalError求助

解决LeetCode #5《最长回文子串》时遇到UnboundLocalError错误

我在解决LeetCode #5《最长回文子串》问题时,代码始终抛出UnboundLocalError错误,不清楚原因。以下是我的Python代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def isPalindrome(s):
            if len(s) == 1:
                return True
            if len(s) == 2 and s[0] == s[1]:
                return True
            else:
                if s[0] == s[-1]:
                    return isPalindrome(s[1:-1])
                else:
                    return False
        max_ = 0
        lenght = len(s)
        for i in range(lenght):
            for r in range(i + 1, lenght):
                if isPalindrome(s[i:r]):
                    len_ = r - i + 1
                    if len_ > max_:
                        max_ = len_
                        final = s[i:r]
        return final

报错信息如下:

UnboundLocalError: local variable 'final' referenced before assignment
    return final

我猜测问题可能出在最终回文串长度为1的场景中,此时切片s[i:r]可能存在问题,希望有人帮忙分析错误原因。


错误原因分析

  • final变量未初始化:当输入字符串中没有长度≥2的回文子串时(比如字符串长度为1,或所有长于1的子串都不是回文),循环内的final = s[i:r]永远不会执行,final变量未被定义,执行return final就会触发UnboundLocalError。
  • 切片与长度计算不匹配:Python中s[i:r]是左闭右开区间,实际子串长度为r - i,但你的代码中计算len_ = r - i + 1,这会导致长度计算错误,影响max_的更新逻辑。
  • 遗漏长度为1的回文场景:当最长回文是单个字符时,你的代码没有为final赋值,直接返回会触发变量未定义错误。

修复方案

  1. 初始化final和max_:直接将final初始化为字符串的第一个字符(LeetCode输入s非空),max_初始化为1,确保即使没有更长的回文,也有合法返回值。
  2. 修正长度计算:将len_ = r - i + 1改为len_ = r - i,或者直接用len(substr)获取子串长度,避免手动计算出错。
  3. 调整循环范围:内层循环的r应该遍历到length + 1,这样才能取到从i到字符串末尾的子串(s[i:length]),否则会遗漏最后几个字符组成的子串。

修复后的代码示例:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # 简化回文判断逻辑,直接用字符串反转对比
        def isPalindrome(substr):
            return substr == substr[::-1]
        
        if not s:
            return ""
        max_len = 1
        final = s[0]
        length = len(s)
        
        for i in range(length):
            # r的范围改为i+1到length+1,确保能取到s[i:length]
            for r in range(i + 1, length + 1):
                substr = s[i:r]
                if isPalindrome(substr):
                    current_len = len(substr)
                    if current_len > max_len:
                        max_len = current_len
                        final = substr
        return final

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:05:26