模式串匹配KMP詳解

2022-05-18 05:35:55 字數 1121 閱讀 5818

關於kmp模式串匹配網上蠻多的.

對於kmp有自己理解所以寫下來希望能夠對你們的學習有幫助.

之前暑假的時候學過,然後好長時間沒用發現又忘了,現在再看看發現有了新的理解.

1.關於kmp的next陣列的問題.

相信很多童鞋會迷在這裡,next到底是幹什麼的?

next儲存的是第i個位置字首串和字尾串第乙個字元不相同的位置.

下面我們來畫圖理解一下

next[11] = 4

next[11]也就是k的位置,下面我們來解釋一下為什麼k的next為什麼是4

首先是字首串和字尾串, 我們是以k前面的位置開始,來進行匹配,可以看我們串的紅色部分,就分別是我們的字首串(從字串開頭到c的前乙個位置為字首串)和字尾串.

k的next就是最先不匹配的位置.也就是c了, c的下標就是4.

2.知道了next然後我們如何去匹配呢??

上我們的第二張圖

解釋一下:

第一次串匹配,當我們匹配到i的位置的時候,我們會判斷i和主串的相應位置是否匹配.如果匹配繼續向下匹配,如果不匹配則按照下面的規則進行.

在不匹配的情況下:按照傳統的模式串匹配我們要從第乙個串的位置開始要重新進行匹配.

但是現在我們並不需要從第乙個位置開始了.要從什麼位置開始呢?從我們的next[i]的位置重新開始匹配就行了.

第二次串匹配:第二次串匹配就是從next[i]的位置重新開始匹配. 因為我們知道字首串和字尾串是一樣的,因此我們的重新匹配的位置就不需要大的改動了.

下面就是**的實現:   

#include#include

#define maxn 1000

void getnext(int next,char

t)

else

j =next[j];

}}int kmp(char s,char

t)

else

}if(j ==lent)

return i-j;

return -1;}

intmain()

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為o m n kmp匹配演算法。可以證明它的時間複雜度為o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t in...

KMP字串模式匹配詳解

簡單匹配演算法的時間複雜度為o m n kmp匹配演算法時間複雜度為o m n 一 簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t int pos if else k next k while get nextval 另一種寫法,也差不多。voi...

KMP字串模式匹配詳解

kmp字串模式匹配詳解 kmp字串模式匹配通俗點說就是一種在乙個字串中定位另乙個串的高效演算法。簡單匹配演算法的時間複雜度為 o m n kmp 匹配演算法。可以證明它的時間複雜度為 o m n 一.簡單匹配演算法 先來看乙個簡單匹配演算法的函式 int index bf char s char t...