KMP演算法詳解C 實現

2021-08-16 06:55:26 字數 1246 閱讀 8248

kmp演算法是判斷兩個字串str1中是否包含與str2相同的子串。

next陣列概念

kmp演算法最關鍵的就是next陣列。next陣列就是針對str2串中每個字元前的子串中存在的字首與字尾匹配的最長長度。假設str2為「abababca」。

j=0,字元str2[j]=a,a前沒有字串,預設為next[0]=-1;

j=1,字元str2[j]=b,b前子串為「a」,前字尾不存在,預設為next[1]=0;

j=2,字元str2[j]=a,a前子串為「ab」,前字尾不存在相等,則next[2]=0;

j=3,字元str2[j]=b,b前子串為「aba」,前字尾最大相等為a,則next[3]=1;

以此類推next[9]=[-1,0,0,1,2,3,4,0]

kmp匹配過程

next求法

通俗易懂的話來說就是你要求解當前位的next值,則看前一位與前一位next所在位字元是否相等,相等則當前位的next等於前一位next+1,如果不等就找前一位next的next與前一位比較,如果相等,當前位的next等於那個與前一位字元相等的字元所在位置+1,如果還是不相等,則以此類推,直到出現比較位為next=-1,那當前位的next就等於-1。

#include

#include

#include

#include

using

std::cout;

using

std::endl;

void getnext(int *next,const

std::string &str)

else

}}bool substring(const

std::string &str1, const

std::string &str2, std::vector

&position)

}else

}delete next;

if (position.empty())

else

}int main()

while (true)

return

0;}

其中很多參考楊守樂文章:

KMP演算法詳解(C語言實現)

kmp的演算法分析 kmp解決問題 清除bf演算法中主串s指標出現的回溯情況,即當主串s和子串t在某個字元不匹配的時侯,主串s的指標位置不變,改變子串t的指標位置,使主串和子串的字元匹配 演算法思路 建立乙個next陣列,當出現主串字元與子串字元不匹配時,將模式串t的指標 j 移動到next j 的...

KMP演算法c 實現

遞推求解next陣列,初始的情況是next 0 1.假設在某乙個時刻有如下的等式成立 str 0.k 1 str j k.j 1 那麼next j k,在這個前提下,繼續進行下乙個字元的匹配.1 如果str 0.k str j k.j 那麼next j 1 next j 1 k 1.2 反之,如果上...

KMP演算法C實現

這種演算法是d.e.knuth 與v.r.pratt和j.h.morris同時發現的,因此人們稱為kmp演算法。此演算法可以在o n m 的時間數量級上完成串的模式匹配操作。其基本思想是 每當匹配過程中出現字串比較不等時,不需回溯i指標,而是利用已經得到的 部分匹配 結果將模式向右 滑動 盡可能遠的...