資料結構 字串匹配KMP

2021-07-04 21:47:14 字數 656 閱讀 3083

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 的字串,要查...