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赋值,直接返回会触发变量未定义错误。
修复方案
- 初始化
final和max_:直接将final初始化为字符串的第一个字符(LeetCode输入s非空),max_初始化为1,确保即使没有更长的回文,也有合法返回值。 - 修正长度计算:将
len_ = r - i + 1改为len_ = r - i,或者直接用len(substr)获取子串长度,避免手动计算出错。 - 调整循环范围:内层循环的
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
相关产品推荐
相关产品推荐

