c語言浙大版 KMP模式串匹配實現

2021-10-05 18:33:15 字數 813 閱讀 5403

本博文源於浙江大學《資料結構》,今天跟隨姥姥學習kmp演算法,kmp演算法是三位大師根據字串模式匹配研究出來的一種演算法。它的時間複雜度從o(n*m)===>o(n+m),堪稱乙個時間複雜度的飛躍,而這些無非是演算法設計的好,演算法是程式設計師的魂!

kmp首先要獲得原串和目標串的長度,然後去獲得最長真子串,然後根據strstr函式一樣兩個指標不停的位移,如果位移兩者不相等,呼叫match函式繼續位移,一次遍歷就把結果實現,強啊!

還是先獲得字串的長度,然後將match陣列的0設為-1,開始進行位移。

//kmp實現

#include

#include

#include

typedef

int position;

#define notfound -1

void

buildmatch

(char

*pattern,

int*match)

}position kmp

(char

*string,

char

*pattern)

else

if(p>

0) p = match[p-1]

+1;else s++;}

return

(p==m)

?(s-m)

:notfound;

}int

main()

模式串匹配 KMP

樸素的的模式串匹配演算法通常要在向前移動文字指標之後,回溯模式串指標,其效率為o m n 而kmp演算法則挖掘了一些模式串中的一些資訊,來加快匹配的效率。kmp演算法的緊隨便是覆蓋函式next。當模式串p j 和文字串s i 失配時,j指標不是簡單的回溯,而是指向next j 覆蓋函式next如何定...

模式串匹配,kmp

include include include include define maxstrlen 255 可以在255以內定義最大串長 typedef char sstring maxstrlen 1 0號單元存放串的長度 void get next sstring t,int next void ...

kmp模式串匹配

作用 字串匹配 我們設匹配串為t,待匹配串為s,這個演算法的功能就是在指定s中,從s的第i位字元開始搜尋,判斷在s中是否有t存在。如果有則返回出現了t的首位字元位置 當然,這個陣列是從0開始 如果沒有則返回0。通過next陣列對匹配串t進行乙個預處理,我們獲得乙個next陣列。下面的描述 strin...