滑动窗口之最长子串模板之最长无重复子串

我们经常会遇见许多设计到字符串的题目,很多中等难度的题目都会用上滑动窗口算法,所以就稍微学习了下。

根据网上所言,滑动窗口算法用于求满足某种条件的最短或最长子数组(子串)如:
1)最小摘要
2)sum大于target的最短子数组
3)最长的无重复字符的子串
4)最长的最多有k个不同字符的子串
本次做了道最长无重复字符子串的题目
题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

不多加以思考,硬套模板,尝试能否解出题目。


滑动窗口之最长子串模板之最长无重复子串_第1张图片
最长模板

首先是基础的声明:


滑动窗口之最长子串模板之最长无重复子串_第2张图片

字符串长度为0,那么结果肯定是0,就返回。
由于题目要求求不重复的子串,不重复那肯定是集合,所以用集合来存子串。
max_length就是所求的解。
left就是滑动窗口必备的左坐标。

然后开始套:


滑动窗口之最长子串模板之最长无重复子串_第3张图片

先是窗口右端扩展,加进s[j],更新条件,虽然不知道为什么,但是扩展肯定是在child中插入s[j]了,故:


滑动窗口之最长子串模板之最长无重复子串_第4张图片

第二步,不满足的条件:
往这边思考,寻找不重复的子串的不满足条件那就是找到重复字符了,所以while里面就是子串有字符重复的判定。


滑动窗口之最长子串模板之最长无重复子串_第5张图片

如果find函数的返回值和end函数相等,说明直到找到最后面都找不到,而一旦不相等就说明重复了。

第三步,移除左端的s[j],更新条件,然后i++,这里的i++指的应该是left坐标。


滑动窗口之最长子串模板之最长无重复子串_第6张图片

第四步,此时重新满足条件,和最优比较并记录。那就是要记下最大长度咯。

滑动窗口之最长子串模板之最长无重复子串_第7张图片

j-left+1就是滑动窗口包住的子串的长度。

套完了,试着提交一下。


滑动窗口之最长子串模板之最长无重复子串_第8张图片

并没有能过呢~
什么原因呢?分析一下整体逻辑


滑动窗口之最长子串模板之最长无重复子串_第9张图片

发现child.insert()先插入了s[j],再进行判断,这样必然导致每一次都能在child中找到当前的字符。所以要先判断有无重复,再插入才对,所以要将插入语句移到判断条件后面。
滑动窗口之最长子串模板之最长无重复子串_第10张图片

再提交下试试:


滑动窗口之最长子串模板之最长无重复子串_第11张图片

过了,模板牛逼。

你可能感兴趣的:(滑动窗口之最长子串模板之最长无重复子串)