kmp主要用於字串匹配
關鍵在於next陣列的求解,當匹配不成功的時候模式串的回退位置就由next陣列決定。
next陣列只與主串有關,其求解過程就運用到了kmp思想,求解過程網上很多,個人覺得比較難以理解。
next陣列應用,下標從1開始:
字首與字尾的最大匹配長度,next[i]為字首與字尾的最長匹配長度
求迴圈節,迴圈週期
if i%(i-next[i])==0,說明字串前i個是迴圈的,迴圈長度就是i-next[i]
kmp基本**:
#include#includeusing namespace std;
#define n 100010
int next[n];
char s[n],sp[n];
void getnext(int n)
int main()
{ int t,i,j,len1,len2;
cin>>t;
while(t--)
{ cin>>s;
cin>>sp;
len1=strlen(s);
len2=strlen(sp);
getnext(len1);
if(kmp(len1,len2)>0) cout<<"start position:"<
資料結構 字串模式匹配的KMP演算法
kmp演算法是模式匹配的一種演算法,他的思想是,當我們進行模式匹配的時候,不用像暴力解法那樣乙個乙個字元去比較,而是從前一串字元的最大前字尾開始匹配,這樣就節省了不少時間 數學推導 假如i代表主串指標,j代表子串指標 如果有 i2 j2 j1 j2 那麼i2 j1,我們在後乙個字元失配 的時候,可以...
資料結構 字串匹配
演算法 如下,包括暴力匹配和kmp演算法。參考 include stringmatching.h stringmatching stringmatching void stringmatching stringmatching void 返回子串t在主串s中第pos個字串之後的位置。若不存在,則返回...
演算法與資料結構 字串模式匹配 KMP 演算法
在乙個很長的字串 t 中,查詢是否存在子字串 p。例如搜尋引擎收錄的大量 資料,當使用者輸入關鍵字後,就會在這些資料中進行匹配,並返回合適的 語義 假定字串長度為 j,則所有字串都在 0,j 這樣的集合中。返回首次匹配的字元的位置。注意這裡呼叫方需要判斷位置是否正確,例如對於長度為 i 的字串,要查...