資料結構 KMP

2021-07-10 18:57:35 字數 719 閱讀 2948

今天下午實現了kmp演算法

這個演算法算是奇妙,本機器看了10遍左右才基本理解

演算法的核心就是求出next,再依次根據next跳轉,這樣就能線性地匹配出字串

這裡推薦一篇博文說得很好,深入淺出,只是在next陣列是從1開始的,而pattern是從0起始,這也算是前幾次學習的時候沒有理解的地方

今天下午寫的**也應用了template,也能相容其他的資料型別,練習了一下c++

#include "iostream"

#include "string"

using namespace std;

template class kpm

int getresult();

};template int* kpm::buildnext()

++t;

++i;

if (pattern[i - 1] == pattern[t - 1])

else

}for (int i = 1; i < max_p +1 ; i++)

cout << endl;

return next;

}template int kpm::getresult()

else

}if (p == max_p + 1)

else }

int main()

資料結構 KMP演算法

求串的模式值next n 定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且 j的前面的 1 k個字元與開頭的 1 k個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6...

資料結構 KMP演算法

在我的理解,kmp演算法最核心的同時最難理解的是這個next 函式。但是,next 的值是挺好求的,難在哪呢?這個函式難在邏輯。理解起來很費勁,但真的很好用,並且這個函式的結果很好求。例如求模式串t ababaaa 的next j 的函式值 是這樣的,當j 0,next 0 1,對於任何子串,第乙個...

資料結構 KMP演算法

要完善乙個string字串類,那麼實現查詢子串的功能是必不可少的,實現子串查詢可以使用樸素演算法,每次匹配乙個字元後向右移動乙個位置,這樣執行下來效率是比較低的,所以就有了kmp演算法,它能夠準確的知道當前字元不匹配後字串應該向右移動多少位,由於剛接觸kmp演算法,所以很多還明白的不是很透徹,在此記...