我們經(jīng)常會遇見許多設計到字符串的題目,很多中等難度的題目都會用上滑動窗口算法,所以就稍微學習了下。
根據(jù)網(wǎng)上所言,滑動窗口算法用于求滿足某種條件的最短或最長子數(shù)組(子串)如:
1)最小摘要
2)sum大于target的最短子數(shù)組
3)最長的無重復字符的子串
4)最長的最多有k個不同字符的子串
本次做了道最長無重復字符子串的題目
題目鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
不多加以思考,硬套模板,嘗試能否解出題目。

最長模板
首先是基礎的聲明:

字符串長度為0,那么結果肯定是0,就返回。
由于題目要求求不重復的子串,不重復那肯定是集合,所以用集合來存子串。
max_length就是所求的解。
left就是滑動窗口必備的左坐標。
然后開始套:

先是窗口右端擴展,加進s[j],更新條件,雖然不知道為什么,但是擴展肯定是在child中插入s[j]了,故:

第二步,不滿足的條件:
往這邊思考,尋找不重復的子串的不滿足條件那就是找到重復字符了,所以while里面就是子串有字符重復的判定。

如果find函數(shù)的返回值和end函數(shù)相等,說明直到找到最后面都找不到,而一旦不相等就說明重復了。
第三步,移除左端的s[j],更新條件,然后i++,這里的i++指的應該是left坐標。

第四步,此時重新滿足條件,和最優(yōu)比較并記錄。那就是要記下最大長度咯。

j-left+1就是滑動窗口包住的子串的長度。
套完了,試著提交一下。

并沒有能過呢~
什么原因呢?分析一下整體邏輯

發(fā)現(xiàn)child.insert()先插入了s[j],再進行判斷,這樣必然導致每一次都能在child中找到當前的字符。所以要先判斷有無重復,再插入才對,所以要將插入語句移到判斷條件后面。

再提交下試試:

過了,模板牛逼。