卷首语:
Sometimes accompanied sometomes alone,stay awesome all the time.
聚散终有时,潇洒走一回。
滑动窗口是一种双指针对暴力算法对优化:
对序列s,若想得到符合规则A的所有结果,构建序列r,右侧逐个进入新数据,然后检查整体的合理性,如果整体符合A,那么保持进数,反之左侧出数直到符合A为止:
例题:
Leetcode 3:
第一种窗口构建:
![](https://i-blog.csdnimg.cn/blog_migrate/56e61656abfe17612f5eecbda87b03b6.jpeg)
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s: return 0
left = 0
lookup = set()
n = len(s)
cur_len = 0
max_len = 0
for i in range(n): #将每一个元素读入窗口
cur_len += 1
#左侧删除
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len: max_len = cur_len
lookup.add(s[i])
return max_len
做法较为简单,可以用list来做优化:
class Solution(object):
def lengthOfLongestSubstring(self, s):
lst = []
n = len(s)
ans = 0
for i in range(n):
while s[i] in lst:
del lst[0] # 队首元素出队
lst.append(s[i]) # 排除重复元素后 新元素入队
ans = max(ans, len(lst))
return ans