LeetCode438-关于滑动窗口问题中while循环内的循环条件
来源:3-8 在滑动窗口中做记录 Longest Substring Without Repeating Characters
夏之秋
2021-08-08
bobo老师好,我的疑问是关于滑动窗口问题中while循环内的循环条件
在视频3-7中
在视频3-8中
根据上面两种情况还有做了几道题目,我觉得滑动窗口的大概思想是这样的
(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循环的条件感到疑惑
这样的意思是当窗口还能够向右滑动的时候,进入循环。
我的疑惑是:
老师你是怎么想到把while里面的条件改为
r+1 < s.size()
的?按照课程里面讲的例子,不应该是**窗口还存在的条件,即r < s.size()
**吗?
1回答
-
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 ++ 即可; 整体因为他是一个定长的滑窗,所以其实比你列举的视频中的问题更简单:)
继续加油!:)
012021-08-08
相似问题