摘要:當循環(huán)到的時候,記錄一下這個最后一次出現(xiàn)的位置在哪里。最后,這道算法題的出處來自里面有各種各樣的實現(xiàn)方法,可以作為參考。覺得本文對你有幫助請分享給更多人關(guān)注妙味前端加星標,關(guān)注更多內(nèi)容
尋找最長的不含有重復字符的子串
可能看標題不會明白這個題到底什么意思,來看看下面的例子:
abcabcbb ? abc ? 3
bbbb ? b ? 1
pwwkew ? wke ? 3
看了栗子是不是明白了呢?
其實需求很簡單,實現(xiàn)的方法也很多,不過在這里我要來寫一種效率最高的算法,只需要一次循環(huán)就可解決:
function findNoRepeatMaxLenStr (str) { let lastPositions = {} let start = 0 let maxLen = 0 for (let i=0; i= start) { start = lastPositions[s] + 1 } if (i - start + 1 > maxLen) { maxLen = i - start + 1 } lastPositions[s] = i } return maxLen } // test console.log(findNoRepeatMaxLenStr("abcabcbb")) // 3
那么看完代碼,請自己先胡思亂想一下,能看得懂不?
…
行了,看到這我就知道你沒看懂,那么來解釋一下吧。
思路是這樣的,假如下面的圖形是一個字符串,每個格子代表一個字符:
此時咱們開始使用 for 循環(huán)掃描整個字符串,當掃描到 x(x 代表任意位置的任意的字符串)的時候,那么咱們應該怎么做呢?
首先要記錄一個 start 起始位置,當然一開始就是 0 了,那么 start 在循環(huán)中不僅僅只是表示字符串從 0 開始,還表示當前不含有最長重復子串的開始,那么咱們要做的事情就一件:保證從 start 到 x 之間沒有重復的字符串,再說的通俗點就是看檢查 start 到 x 之間有沒有重復的 x 。
那么怎么做到檢查這個動作呢?
這個時候 lastPositions 就派上用場了。當循環(huán)到 x 的時候,記錄一下這個 x 最后一次出現(xiàn)的位置在哪里。
那么記錄完畢之后,當進行檢查 start 到 x 之間 是否有重復的 x 的時候,咱們就去問 lastPositions[x],此時會有2種情況:
第一種情況是 x 從來沒有出現(xiàn)過或者出現(xiàn)在了 start 之前;
第二種情況是 x 出現(xiàn)在 start 到 x 中間。
那么對于第一種情況,咱們不用去管。而第二種情況自然是不滿足條件的情況了,此時,咱們就要更新 lastPositions[x],將這個 x 的位置更新為 lastPositions[x] + 1。
總結(jié)下來就是:
lastPositions[x] 不存在或 < start 滿足條件,無需操作
lastPositions[x] 存在并且 >= start 不滿足條件,更新 lastPositions[x]++
那么在結(jié)合上面的代碼,邏輯就清晰了,唯一有些繞圈圈的地方就是第二個 if 中的 +1 操作,原因就是字符串的索引是從 0 開始的,那么假如第一個為 x 滿足條件,實際索引是0,那么長度應該是 0 + 1 = 1。
最后,這道算法題的出處來自:
https://leetcode.com/problems...
里面有各種各樣的實現(xiàn)方法,可以作為參考。
覺得本文對你有幫助?請分享給更多人
關(guān)注【妙味前端】加星標,關(guān)注更多內(nèi)容
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/99409.html
摘要:解決方案異或操作異或運算是對于二進制數(shù)字而言的,比如說一個有兩個二進制,如果兩個值不相同,則異或結(jié)果為。比如說,本質(zhì)上其實是和的每一對比特位執(zhí)行異或操作,等價于下面數(shù)字對應的二進制數(shù)字對應的二進制數(shù)字對應的二進制因此的結(jié)果就為啦。 新年第一篇文章,先祝大家新年快樂??!那么接下來進入正文。 前言 前陣子突發(fā)奇想,突然開始刷leetcode。其中刷到了一道有意思的題目,發(fā)現(xiàn)這道題是當時秋招...
摘要:二進制本身就是為這個數(shù)字而使用的,所以說這道面試題直指二進制的使用是沒錯的。正負在二進制中,第一位為的是負數(shù),是正數(shù)。 showImg(https://segmentfault.com/img/bVbd7d0?w=1580&h=732); 前言 使用PHP,給定一個數(shù),判斷這個數(shù)是否是二的N次方 這樣看似簡單的一個面試題, 實際牽出了很多基礎知識,本章在為大家補習基礎知識的情況下來解答...
摘要:但是題目非要弄成鏈表的形式,說實在的,我真沒有見過前端什么地方還需要用鏈表這種結(jié)構(gòu)的除了面試的時候,所以說這種題目對于實際工作是沒什么用處的,但是腦筋急轉(zhuǎn)彎的智商題既然這樣出了,我們就來看看怎么解決它吧。 今天在知乎上看到一個回答《為什么前端工程師那么難招?》,作者提到說有很多前端工程師甚至連單鏈表翻轉(zhuǎn)都寫不出來。說實話,來面試的孩子們本來就緊張,你要冷不丁問一句單鏈表翻轉(zhuǎn)怎么寫,估計...
摘要:閉包有多重前端知識點大百科全書前端掘金,,技巧使你的更加專業(yè)前端掘金一個幫你提升技巧的收藏集。 Vue全家桶實現(xiàn)還原豆瓣電影wap版 - 掘金用vue全家桶仿寫豆瓣電影wap版。 最近在公司項目中嘗試使用vue,但奈何自己初學水平有限,上了vue沒有上vuex,開發(fā)過程特別難受。 于是玩一玩本項目,算是對相關(guān)技術(shù)更加熟悉了。 原計劃仿寫完所有頁面,礙于豆瓣的接口API有限,實現(xiàn)頁面也有...
閱讀 1077·2023-04-26 02:21
閱讀 2881·2021-09-24 09:47
閱讀 1666·2019-08-30 15:55
閱讀 2239·2019-08-30 14:01
閱讀 2398·2019-08-29 14:01
閱讀 2114·2019-08-29 12:46
閱讀 878·2019-08-26 13:27
閱讀 2027·2019-08-26 12:23