KMP 演算法研究

2021-06-19 04:26:05 字數 1289 閱讀 3795

定義:(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]=-1

,因t[3]=t[6](3

)next[j]=k   

意義:模式串

t中下標為

j的字元,如果

j的前面k個

字元與開頭的

k個字元相等,且

t[j] != t[k] (1

≤k)。 即

t[0]t[1]t[2]

。。。t[k-1]==

t[j-k]t[j-k+1]t[j-k+2]…t[j-1]

且t[j] != t[k].(1

≤k);(4) next[j]=0  

意義:除(1)(

2)(3)的其他情況。

具體的演算法如下:

/***定義:

(1)next[0]= -1  意義:任何串的第乙個字元的模式值規定為-1。

(2)next[j]= -1   意義:模式串t中下標為j的字元,如果與首字元

相同,且j的前面的1—k個字元與開頭的1—k

個字元不等(或者相等但t[k]==t[j])(1≤k

#include

using namespace std;

class test

next[0] = -1;

for (i=1;i 0; k--)

}if (flag == 0)

}return -1;}};

int main()

{//const char* t= "ababcaabc";

//char* t= "abcabcad";

//const char* t= "abcabd";

const char* t= "aaaaaaaaaab";

test t;

int a = 0;

int* next = new int[strlen(t)];

t.getnext(t, strlen(t), next);

for (int p = 0; p< strlen(t);p++) {

cout<

KMP演算法研究

本人愚笨,csdn上看了很多解法都不了解,而且很多解法都有些問題。自己看了書研究了乙個晚上才大概明白了這一原理。特此附上自己寫的解法和見解。kmp是對於字串匹配蠻力解法的乙個改進,原理就是在求出模式子串自己內部的重複模式,舉個簡單的例子,主串s ababaababcb 子串t ababc t 0 t...

KMP演算法研究(一)

t 主串 w 模式串 next i 模式串中從第1個字元到第i 1個字元構成的子串的最大字首字尾相等數目。kmp演算法主要是功能便是判斷模式串是否出現在主串中,並找出相應的出現位置。而在常規的暴力破解演算法中,通常採用順序比對的方法進行查詢,也就是將模式串依次與主串的第1 2 3.個字元比較,直到找...

KMP演算法的研究

前腳學後腳忘,是時候給自己通俗易懂的總結一下了 在電腦科學中,knuth morris pratt字串查詢演算法 簡稱為kmp演算法 可在乙個字串s內查詢乙個詞w的出現位置。乙個詞在不匹配時本身就包含足夠的資訊來確定下乙個匹配可能的開始位置,此演算法利用這一特性以避免重新檢查先前配對的字元。這個演算...