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 長...