题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串 的长度。
【题目来源:力扣(LeetCode)】
滑动窗口(Sliding Window)
滑动窗口算法是在给定特定窗口大小的数组或字符串上执行要求的操作。该算法可以将一部分问题中的嵌套循环转变为一个单循环,因此它可以减少时间复杂度。滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,就像队列一样,一端在添加元素的过程中另一端也在删除元素,以此来达到不断更新窗口的元素直到匹配出我们最需要的结果。
图示:
分析
由题可知,该题中滑动窗口的长度不固定,所以我们采用定一(i)移一(j)的方法。一直循环到移动的元素和固定的元素相同,则移动窗口的长度为J - I,再固定下一个元素,一直到目标被完全遍历,返回窗口最大长度。
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic, res, i = {}, 0, -1
for j in range(len(s)):
if s[j] in dic:
i = max(i, dic[s[j]])
dic[s[j]] = j
res = max(res, j - i)
return res