最近在搞這個東西,不知道為啥,看一遍sb一遍。終於在今天下午從宿舍裡猛的一起,狂奔到機房中,還在懵逼狀態下的我終於搞懂了這個演算法。縱觀全網,kmp雖然是個很老很經典的演算法,部落格關於它的講解也不少,我就把我的理解寫一遍,希望對大家有所幫助。
首先kmp這個東西是幹啥使的呢?比如你在打亡者農藥,你方后羿無腦站前排輸出,阿珂切tank,安琪拉大招刷野怪,呂布跳下去就g了,你項羽滿血衝進去滿血衝出來,你是不是這個時候特別想罵一句**呢?對,就是這個**,這種髒話過濾器就是用了kmp演算法。下面就開始正式寫這個演算法。
這是個模板題。
首先理解這個演算法的流程。我們普通的暴力演算法是有乙個文字串s1,乙個模式串s2,長度分別是len1,len2。開始就是把文字串for一遍,如果s1[i]==s2[t],i++,t++,否則t=0,即當前文字串停止下一位的進行,而模式串從頭上開始匹配對不對。這種方法實在是太慢了。而kmp這個演算法的流程是,比如ababc,abc,開始的兩位相等,而第三位a!=c,如果這是暴力演算法,你的模式串將會從頭開始匹配,而kmp則不然,他只需要再匹配乙個c就好了,因為他記錄了c前面的ab,與他正好是公共序列,所以時間複雜度的優勢就體現了出來。
如上圖的文字串和模式串,一開始a與a相等,b與b相等,但是到了第三位,a與c不相等,根據next陣列,當我們失配時,我們就可以向後移動next個單位,就像上圖,當你失配後,直接移動next個單位,開始匹配。
如上圖。現在可能會問,那怎麼處理next陣列呢?
處理next陣列也不難,我們只需要自己匹配自己就好了。那為啥呢,我們自己匹配自己,記錄我們的模式串字首的多少。
for(int i=1; i)以上就是這個演算法,雖然是mp
#include#include#include
#include
using
namespace
std;
char a1[1000001],a2[1000001
];int kmp[2000000
];int
main()
k=0;
for(int i=0; i)
for(int i=1; i<=len2; i++)
cout
}
學習筆記 KMP
kmp用於在乙個字串中尋找乙個模式串。kmp詳細講解 一 演算法思想 下標從0開始 當我們需要在乙個字串中s找乙個模式串p是否出現的時候,最容易想到的就是暴力 列舉左端點,然後從這個點開始匹配,失敗則換下乙個左端點 如圖所示 我們先匹配了a b c並且都成功了。但下一位d a,所以我們需要重新在s中...
KMP 學習筆記
我們將待匹配的字串稱為主串,用來匹配的字串稱為模式串 模式串長度小於等於主串長度 設模式串p為 orzzorzo 主串s為 orzzorqworzzorzo 使用樸素演算法進行匹配時 表示匹配成功,表示在此字元失配 orzzorqworzzorzo orzzorzo首先,將兩串對齊,從左到右匹配p與...
學習筆記 KMP演算法
kmp演算法是一種可以在 o n m 的時間複雜度內實現兩個字串匹配的演算法。acwing 831.kmp字串 給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串p在模式串s中多次作為子串出現。求出模板串p在模式串s中所有出現的位置的起始下標。輸入格式 第一行輸...