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


posted @ 2022-02-24 15:11  佰貳  阅读(27)  评论(0编辑  收藏  举报