KMP的簡單實現

2021-08-02 09:51:35 字數 1150 閱讀 3776

kmp演算法是一種效率非常高的字串匹配演算法。

給定兩個字串str和ptr,長度分別為n和m,判斷str是否在ptr中出現,如果出現則返回出現的位置。

kmp演算法實現方式

我先舉個例子:

str:abcabcabe

ptr:abcabe

首先將abcabe轉化為next陣列000120

這是怎麼轉化的呢,

第一位表示a 它的最長 的 相同的字首和字尾的長度為 0

第二位表示ab 它的最長 的 相同的字首和字尾的長度為 0

第三位表示abc 它的最長的 相同的字首和字尾的長度為 0

第四位表示abca 它的最長的相同的字首和字尾的長度為1(字首a 字尾a)

第五位表示 abcab 它的最長的相同的字首和字尾的長度為2(字首 ab 字尾ab)

第六位表示abcabe 它的最長的相同的字首和字尾的長度為0

注意:字首表示第一位到倒二位。

將ptr轉化為next陣列後,我就開始比較。

str[0]==ptr[0],

接著str[1]==ptr[1]繼續比較直到str[5]!=ptr[5],這時將str[5]和ptr[next[5-1]]進行比較。為什麼這樣呢?

str:abcabcabe

ptr:abcabe

000120

當c不等於e時,e前表示已經匹配成功,next[5-1]表示e前的元素 相同的字首和字尾 的 最長長度為2.

選擇str匹配不成功的c和ptr[next[5-1]]即(ptr[2])進行匹配。

str:abcabcabe

ptr: abcabe

匹配成功。

附上**:

#include

#include

#define m 1000

#define n 100

int * getnext(char *str ,int len)else

}return next;

}int kmp(char

str,int slen,char ptr,int plen)else

if(j==plen)

}return -1;

}void main()

KMP的簡單實現和理解

在沒介紹之前我們先上乙個bf的字串匹配演算法的 include include include using namespace std void bao char a,char b else if j x intmain 執行結果 執行結果為從0開始的下標 因為kmp是上面這個 的優化版,所以因先看...

kmp的簡單應用

給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長度小於1000000 string1和string2中保證不出現空格。對於每組輸入資料,若s...

KMP簡單應用

kmp簡單應用 time limit 1000ms memory limit 65536k 給定兩個字串string1和string2,判斷string2是否為string1的子串。輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長...