LeetCode438-关于滑动窗口问题中while循环内的循环条件

来源:3-8 在滑动窗口中做记录 Longest Substring Without Repeating Characters

夏之秋

2021-08-08

bobo老师好,我的疑问是关于滑动窗口问题中while循环内的循环条件

视频3-7

image-20210807221454449

视频3-8

image-20210807221746756

根据上面两种情况还有做了几道题目,我觉得滑动窗口的大概思想是这样的

(1) 初始化窗口对应的辅助变量  
(2) 初始化窗口(初始值为空),一般为 [0,-1]  
(3)  进入 while 循环  
while(存在窗口的条件) {  
 1.根据情况改变r或者l,从而得到一个新的窗口  
 2.检查新窗口是否符合要求  
}

老师觉得我的理解对吗?

还有一个疑问是针对leetcode438。我是看的老师的代码 https://github.com/liuyubobobo/Play-Leetcode/blob/master/0001-0500/0438-Find-All-Anagrams-in-a-String/cpp-0438/main.cpp,代码本身是理解的,我对其中的while循环的条件感到疑惑

image-20210807222600822

这样的意思是当窗口还能够向右滑动的时候,进入循环

我的疑惑是:

老师你是怎么想到把while里面的条件改为r+1 < s.size() 的?按照课程里面讲的例子,不应该是**窗口还存在的条件,即r < s.size()**吗?

写回答

1回答

liuyubobobo

2021-08-08

1)

赞!你的总结非常正确


2)

r + 1 < s.size() 的意思是,我们每次向后看一个字符,如果还能向后看,循环就继续,否则就结束。

之所以可以这么做,是因为这个问题找的是 p 的 anagram,而 p 的 anagram 的长度是固定的,就是 p 的长度。所以以每一个索引 r 为右边界,我们需要考察的滑窗只有一个,而不可能对应多个 l。所以,我们每次在循环里,真正做的事情,就是基于上一个滑窗,然后 l ++, r ++,就得到了一个新的滑窗,看新的滑窗即可。之所以有 if,是因为在处理初始的情况。在 l = 0, r = p.size() - 1 以后,循环内的两个 if 中对滑窗长度的判断,肯定为真的。

这个代码也有别的写法,比如先求最初一个长度为 p.size() 的滑窗,然后每次在循环里 l++, r ++ 即可; 整体因为他是一个定长的滑窗,所以其实比你列举的视频中的问题更简单:)


继续加油!:)

0
1
夏之秋
谢谢老师,理解了
2021-08-08
共1条回复

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7408 学习 · 1150 问题

查看课程