1.kmp演算法用於字串匹配。
2.最直觀的字串查詢,是用兩次迴圈遍歷,演算法複雜度0(m*n).m為待查字串,n為需要查詢的子串。
3.kmp演算法的目的為減少n維度。
4.**:
#include
#include
using
namespace
std;
void getnext(const
string& ptr,int next)
}void kmp(const
string& str,const
string& ptr)
cout
測試結果:
finding string starts at pos:0
finding string starts at pos:15
finding string starts at pos:27
5.next陣列值,即部分匹配值,用於跳過忽略部分不會存在匹配的情況。
「部分匹配值」就是」字首」和」字尾」的最長的共有元素的長度。以」abcdabd」為例,
- 「a」的字首和字尾都為空集,共有元素的長度為0;
- 「ab」的字首為[a],字尾為[b],共有元素的長度為0;
- 「abc」的字首為[a, ab],字尾為[bc, c],共有元素的長度0;
- 「abcd」的字首為[a, ab, abc],字尾為[bcd, cd, d],共有元素的長度為0;
- 「abcda」的字首為[a, ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為」a」,長度為1;
- 「abcdab」的字首為[a, ab, abc, abcd, abcda],字尾為[bcdab, cdab, dab, ab, b],共有元素為」ab」,長度為2;
- 「abcdabd」的字首為[a, ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd, d],共有元素的長度為0。
6.getnext函式
next[0] = 0;//第乙個next為0
for(int i=1,k=0;i//第二個開始,依次計算其他的next值,即求0到i組成的字串的前後相同的最長子串
KMP演算法筆記
kmp演算法我是看july部落格學習,這裡只是做個筆記,詳細內容見july的blog kmp演算法的用途 有乙個文字串s和乙個模式串p,現在要查詢p在s中的位置。暴力匹配演算法需要對文字串s進行回溯,kmp演算法就是讓文字串不回退,只需要移動模式串j即可。kmp演算法大體思想 就是當s i p j ...
KMP演算法筆記
無聊開啟vjuge看了一眼,看到有乙個比賽是ac自動機,開啟看看順便xuexi一下子。需要 kmp複習一下感覺全忘了。附兩篇參考資料 和乙個練習題 include include include include include include include include include incl...
KMP演算法筆記
kmp演算法是一種快速的字串匹配演算法,我們先從暴力字串匹配演算法講起看怎麼對其優化得到kmp演算法。這篇文章 1 暴力字串匹配 有如下兩個字串 a abcabbcabc 和b adfabcabccabcadbcabca 我們要在b中找到a的匹配位置,暴力匹配的做法就是 把a的第乙個元素與b的第乙個...