滑動窗口之最長子串模板之最長無重復子串

我們經(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中找到當前的字符。所以要先判斷有無重復,再插入才對,所以要將插入語句移到判斷條件后面。

再提交下試試:



過了,模板牛逼。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容