Leetcode题解---3.无重复字符的最长子串

 无重复字符的最长子串

Leetcode题解---3.无重复字符的最长子串_第1张图片

解题思路:双指针+滑动窗口

假设原始字符串S如下

Leetcode题解---3.无重复字符的最长子串_第2张图片

从左侧开始遍历S,以i标记窗口左侧,j标记窗口右侧,初始时,i=0,j=0,即开头a所在的位置,此时,窗口大小为1

然后,将j右移,逐步扩大窗口,依次经过b、c、d,此时,窗口内均无重复字符,继续右移j

Leetcode题解---3.无重复字符的最长子串_第3张图片

当j移动到d后面的a所在位置时,对应字符a在窗口中已存在,此时,窗口大小为5,去除当前重复的一位,窗口大小为4。此时窗口内的字符串abcd为

Leetcode题解---3.无重复字符的最长子串_第4张图片

找到窗口中已存在的该字符所在位置,并将i移动到该位置下一位

Leetcode题解---3.无重复字符的最长子串_第5张图片

此时为第二个窗口

Leetcode题解---3.无重复字符的最长子串_第6张图片

继续重复之前的操作,直到j移动到字符串最后一位停止。

代码:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        length = 0
        mark = set()  # 用集合标明是否有出现重复字母
        r = 0  # 右指针
        for i in range(len(s)):
            if i != 0:
                mark.remove(s[i - 1])
            while r < len(s) and s[r] not in mark:  # 如果不满足条件说明r走到了s的尽头或r指向的元素
                mark.add(s[r])  # 将当前r指向的字母加入集合
                r += 1
            length = max(length, r - i)  # 在每一个位置更新最大值
        return length

 

你可能感兴趣的:(Leetcode题解---3.无重复字符的最长子串)