Python编写LeetCode题时已定义longestSubstring仍报NameError求助
Python LeetCode题NameError报错修复方案
报错信息
NameError: name 'longestSubstring' is not defined
currentBest = longestSubstring(s)
Line 38 in lengthOfLongestSubstring (Solution.py)
根因分析
1 触发NameError的直接原因
longestSubstring是Solution类的内部成员方法,Python规则要求类内部调用成员方法必须加实例前缀self.,直接写函数名会被识别为全局函数,全局作用域找不到对应函数就会抛出NameError- 类成员方法定义时第一个参数必须为实例本身
self,你当前longestSubstring的定义没有加self参数,即使加了调用前缀也会出现参数数量不匹配的报错,如果你不需要用到实例属性,可以给方法加@staticmethod装饰器声明为静态方法,就不需要加self参数
2 其他隐藏错误
除了NameError外,你当前代码还存在多处语法和逻辑错误:
- 字符串没有
append方法:你在else分支写的s.append(element)属于笔误,应该是向temp数组添加元素,修改为temp.append(element) - Python中获取字符串长度用内置函数
len(s),没有s.length属性,对应代码修改为tot = len(s) longestSubstring内部遇到重复字符直接break会终止遍历,无法处理重复字符之后的内容,逻辑不符合无重复子串的计算要求- 外层循环中每次调用
longestSubstring(s[1:])永远是截取字符串从索引1开始的子串,不会随循环变量x变化,无法遍历所有起始位置的子串,应修改为longestSubstring(s[x:])
修复参考
基础修复(仅解决NameError及语法错误)
class Solution: # 加静态方法装饰器,不需要self参数 @staticmethod def longestSubstring(s: str) -> int: count = 0 longest = 0 temp = [] for element in s: if element in temp: if count > longest: longest = count count = 0 temp.clear() # 此处break后续仍需调整逻辑,仅先修复语法问题 break else: # 修正append对象 temp.append(element) count += 1 # 补充遍历结束后没有遇到重复字符的场景,需要把当前count和longest比较 return max(longest, count) def lengthOfLongestSubstring(self, s: str) -> int: # 调用类内部静态方法加self前缀 currentBest = self.longestSubstring(s) # 修正获取长度的方法 tot = len(s) for x in range(tot): # 修正截取子串的逻辑 output = self.longestSubstring(s[x:]) if output > currentBest: currentBest = output return currentBest
逻辑优化提示
当前暴力枚举的思路可以跑通,但时间复杂度为O(n²),如果要优化到O(n)可以考虑滑动窗口方案,用哈希表记录字符最后出现的位置,避免重复遍历。
内容的提问来源于stack exchange,提问作者codingtrash
相关产品推荐
相关产品推荐

