KMP演算法研究

2021-07-24 16:40:36 字數 998 閱讀 5195

本人愚笨,csdn上看了很多解法都不了解,而且很多解法都有些問題。自己看了書研究了乙個晚上才大概明白了這一原理。特此附上自己寫的解法和見解。

kmp是對於字串匹配蠻力解法的乙個改進,原理就是在求出模式子串自己內部的重複模式,舉個簡單的例子,主串s = "ababaababcb"子串t = 「ababc」,t[0]~t[1] = t[2]~t[3],如果前次比較主串已經有s[0]~s[3]匹配上了子串t[0]~t[3],只是s[4]與沒有匹配上,就有s[2]~s[3]是等於t[0]~t[1]的,那麼就可以略過,而直接比較s[4]與t[2]了。

而求陣列next本質就是求子串的重複模式。

#include#include#includeint *getnext(char *cht);

int main(int argc, char *argv)

int slen = strlen(argv[1]); //主字串

int tlen = strlen(argv[2]); //模式字串

char *chs = (char *)malloc((slen+1)*sizeof(char));

char *cht = (char *)malloc((tlen+1)*sizeof(char));

strcpy(chs,argv[1]);

strcpy(cht,argv[2]);

//獲得next

int *next = getnext(cht);

//匹配

int index=-1, i=0, j=0;

while (chs[i]!='\0' && cht[j]!='\0')

else

}if (cht[j] == '\0')

index = i - tlen;

printf("index = %d\n",index+1);

return 0;

}int *getnext(char *cht)

next[0] = -1;

while (j

KMP 演算法研究

定義 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...

KMP演算法研究(一)

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

KMP演算法的研究

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