leetcode_算法_3_无重复字符的最长子串
题目描述
题解
参考了评论区的不少题解,但对刚入手的我很多还是想不通的。参考滑动模块的思想,尝试着按照自己最直接的逻辑写了一下。虽然结果通过了,但是用时比较大。有待优化。也不知道从哪里下手,可能本身复杂度就比较高?
上代码,记录下小菜鸡通过时激动的心。
大概思路:设置左右两个节点。对字符串进行遍历,没有遇到重复的时候,都是保持左节点不动,右节点后移。然后记录并储存滑块的长度。当遇到重复的字符时,需要对滑块进行更新,把左节点后移一位,右节点指向左节点(相当于初始化,只不过left不再等于0了),然后再移动右节点,就回到了第一个if。知道右节点到头结束。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = 0
right = 0 #设置左右两个节点
ans = 0 #存放结果长度
res = [] #存放结果字符串
# 右节点不断向后移动,左右节点构成滑块
while right < len(s):
# 如果新进来的不在滑块中,则把右节点后移一位,把这个点添加到滑块中
if s[right] not in res:
res.append(s[right]) #向结果字符串中添加字符
right += 1 #后移右节点
ans = max(ans,len(res)) #更新字符串长度,比较之前的长度(ans)和目前字符串(res)的长度
# 如果已经存在,通过把左后移一位,右节点再次指向左节点的方式,来更新滑块。
else:
left += 1 #左节点后移一位
res = [] #更新滑块,相当于回到最初的起点,重新计算
right = left
return ans