如何遍历Python列表在每个元素停留 求解无重复字符最长子串
问题背景
尝试不使用Set结构求解无重复字符的最长子串问题。
原定解题思路:以字符串的每个元素为起点,向右逐个遍历字符直到发现重复值,记录当前无重复子串的长度,再移动到下一个起点重复操作,最终取所有结果里的最大值。
当前代码无法实现「以每个元素为起点遍历后续内容」的逻辑,现有代码如下:
def lengthOfLongestSubstring(self, s): mylist = list(s) mylist2 = list(s) final_res = [] res = [] for i in mylist2: for char in mylist: if char in res: res=[] break else: res.append(char) if len(res) > len(final_res): final_res = res return final_res
代码问题点
- 两层循环都是遍历完整字符串,内层循环没有和外层的起点绑定,每次都从字符串头部开始扫描,完全不符合从当前起点向右遍历的需求
- 列表直接赋值是引用传递,后续修改
res时会连带改变已经存入final_res的内容 - 题目核心要求是计算最长子串的长度,不需要存储完整子串,直接记录长度的写法运行效率更高
修正后代码(无Set实现)
def lengthOfLongestSubstring(self, s): max_length = 0 str_length = len(s) # 逐个确定子串起点 for start in range(str_length): appeared = [] # 从当前起点向右遍历 for end in range(start, str_length): # 碰到重复字符,直接结束当前起点的遍历 if s[end] in appeared: break appeared.append(s[end]) # 更新最大长度 current_length = end - start + 1 if current_length > max_length: max_length = current_length return max_length
如果需要返回最长无重复子串本身,只需要额外增加两个变量记录最长子串的起止索引,最后对原字符串切片即可。
这个实现完全遵循最初的解题思路,没有使用Set结构,仅用列表完成字符重复判断。
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

