棧和隊(duì)列不再過(guò)多描述,了解入棧出棧規(guī)則,入隊(duì)出隊(duì)規(guī)則,棧的遞歸應(yīng)用即可,面試肯定不會(huì)考這種概念,太簡(jiǎn)單。
LeetCode36棧的應(yīng)用
比如說(shuō)有相當(dāng)多的四則運(yùn)算,前綴,中綴,后綴的題目都與棧有關(guān)。
主要想講一下串這種數(shù)據(jù)結(jié)構(gòu)。串百分之九十九指的都是字符串,對(duì)于一個(gè)字符串S="Googlegoodgoor",來(lái)講想要找到一個(gè)為“goor”的子串,最常用的方法暴力搜索,一位一位的對(duì)照,直至找到相應(yīng)的子串,當(dāng)然這種算法太過(guò)于復(fù)雜,對(duì)于一個(gè)復(fù)雜的字符串,除非你的正則表達(dá)式,用的非常的好,能夠快速定位到需要的東西,否則你需要設(shè)計(jì)相當(dāng)多的代碼,來(lái)實(shí)現(xiàn)這個(gè)功能。下面介紹一種算法,KMP模式匹配算法,能夠大大減少重復(fù)遍歷的情況,這個(gè)算法很重要,2020年在面試騰訊C++崗位,讓我手寫過(guò)KMP算法。
講一下大致流程,原理可以自己分析。
設(shè)模式串為S="abcdaabcab",子串為T="abcab",傳統(tǒng)暴力解決方法S[0],T[0]比較,在比較S[1],T[1],當(dāng)S[3],T[3]不相等的時(shí)候,S退回到S[0],T退回到T[0],當(dāng)我們匹配到S[3],T[3]不等的時(shí)候S有必要退回S[2]重新比較么,顯然第一次比較的所有動(dòng)作全部白費(fèi),KMP很好的解決了這種重復(fù)遍歷的情況,用一個(gè)Next數(shù)組來(lái)保存這些有用的信息。
Next數(shù)組,最長(zhǎng)前綴默認(rèn)Next[0]=-1,什么是最長(zhǎng)前綴,對(duì)于子串a(chǎn)bcab,有相等前綴后綴子串a(chǎn)b。
匹配方法:當(dāng)我們第一次匹配的時(shí)候,S位置在S[3],T位置在T[3]不相等,我們借助next數(shù)組next[3]為0所以子串要退回到T[0]位置,與S[3]相比依然不相等,這時(shí)候就需要S移動(dòng)到S[4]的位置,S[4]=T[0],但S[5]不等于T[1],即子串退回到next[1]的T[0]位置,即從后面開始可以匹配到子串。
LeetCode第28題
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
相關(guān)推薦
stack ,棧(堆棧),是一種先進(jìn)后出(First In Last Out,FILO)的數(shù)據(jù)結(jié)構(gòu),先插入的數(shù)據(jù)在棧底,后放入的數(shù)據(jù)在
發(fā)表于 07-15 08:50
?943次閱讀
的數(shù)據(jù)結(jié)構(gòu)首先列出一些最常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),我們將逐一說(shuō)明:數(shù)組棧隊(duì)列鏈表樹圖字典樹(這是一種高效的樹形結(jié)構(gòu),但值得單獨(dú)說(shuō)明)散列表(哈希表)數(shù)
發(fā)表于 09-30 09:35
的,那樣對(duì)于數(shù)據(jù)的使用簡(jiǎn)直是個(gè)悲劇。針對(duì)此類數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)提供了圖存儲(chǔ)結(jié)構(gòu),專門用于存儲(chǔ)這類數(shù)據(jù)。二、數(shù)
發(fā)表于 05-10 07:58
數(shù)據(jù)結(jié)構(gòu)之隊(duì)列順序隊(duì)列構(gòu)造順序隊(duì)列順序隊(duì)列的初始化判斷隊(duì)列
發(fā)表于 12-17 06:11
數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)?b class='flag-5'>棧鏈?zhǔn)?b class='flag-5'>棧鏈?zhǔn)?b class='flag-5'>棧的定義鏈?zhǔn)?b class='flag-5'>棧操作的實(shí)現(xiàn)鏈?zhǔn)?b class='flag-5'>棧
發(fā)表于 12-17 08:11
數(shù)據(jù)結(jié)構(gòu)課件: 第一章 緒論.pdf 第二、三章 線性結(jié)構(gòu).pdf 第四章
發(fā)表于 08-06 13:21
?0次下載
昨天跟一個(gè)CSDN上的朋友聊天,他說(shuō)現(xiàn)在如果讓他自己手寫一個(gè)棧或者隊(duì)列,估計(jì)都要寫蠻久的,平時(shí)雖然都在用,但是都是別人封裝好的集合。確實(shí),經(jīng)典的數(shù)據(jù)結(jié)構(gòu),包括排序算法,雖然我們平時(shí)不用手寫了,但是
發(fā)表于 11-11 11:34
?2798次閱讀
今天放松一下,我們來(lái)看看數(shù)據(jù)結(jié)構(gòu)中的棧,這節(jié)的知識(shí)點(diǎn)可以說(shuō)是數(shù)據(jù)結(jié)構(gòu)中最容易上手的知識(shí)點(diǎn)了,其實(shí)比起鏈表,其實(shí)鏈表也有棧和隊(duì)列的模型,鏈表的
發(fā)表于 04-29 18:25
?0次下載
讀完本文,可以去力扣解決如下題目: 895.最大頻率棧(Hard) ? 我個(gè)人很喜歡設(shè)計(jì)特殊數(shù)據(jù)結(jié)構(gòu)的問(wèn)題,畢竟在工作中會(huì)經(jīng)常用到基本數(shù)據(jù)結(jié)構(gòu),而設(shè)計(jì)類的問(wèn)題就非??简?yàn)對(duì)基本數(shù)據(jù)結(jié)構(gòu)的
發(fā)表于 03-02 11:02
?1419次閱讀
01 — 隊(duì)列簡(jiǎn)介 隊(duì)列是種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),有個(gè)元素進(jìn)入隊(duì)列稱為入對(duì)(enqueue),刪除元素稱為出隊(duì)(dequeue),隊(duì)列有對(duì)頭(
發(fā)表于 06-18 10:07
?1923次閱讀
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),而隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),兩者原理不難理解,使用也簡(jiǎn)單。
發(fā)表于 07-04 13:28
?2730次閱讀
SystemVerilog中除了數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
發(fā)表于 11-03 09:59
?1593次閱讀
前文用 [單調(diào)棧解決三道算法問(wèn)題]介紹了單調(diào)棧這種特殊數(shù)據(jù)結(jié)構(gòu),本文寫一個(gè)類似的數(shù)據(jù)結(jié)構(gòu)「單調(diào)隊(duì)列
發(fā)表于 04-19 10:50
?651次閱讀
棧和隊(duì)列是比較基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)。無(wú)論在工作中,還是在面試中,棧和隊(duì)列都用的比較多。在計(jì)算機(jī)的世界,你會(huì)看到
發(fā)表于 10-08 15:54
?801次閱讀
Redis是一種內(nèi)存鍵值數(shù)據(jù)庫(kù),常用于緩存、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)分析等場(chǎng)景。它的高性能得益于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)。本文將詳細(xì)介紹Re
發(fā)表于 12-05 10:14
?614次閱讀
評(píng)論