KMP演算法 找出模式串匹配標準串的第乙個位置

2021-09-29 14:46:33 字數 1569 閱讀 6100

arr為題目給出的標準串,brr是給定要尋找位置的子串。

next是我們新開闢的陣列為空,等待我們算出值放入。

void

getnext

(char brr,

char next)

else k = next[k];}

}

先給出**

arr為題目給出的標準串,brr是給定要尋找位置的子串。

next是我們新開闢的陣列為空,等待我們算出值放入。

char next;

intkmpindex

(char arr,

char brr)

else j = next[j];}

//兩方若有一方先掃完,或都掃完

if(j >=

strlen

(brr)

//匹配成功

return i-

strlen

(brr)

;else

return-1

;}

給定標準串a a a a b

給定模式串a a a b

顯然模式串的next表的值為j0

123brr [ ]aa

abnext [ ]-10

12i=0, j=0時

『a』 = 『a』

arr[0] == brr[0] ,所以i++, j++

i=1, j=1時

『a』 = 『a』

arr[1] == brr[1] , 所以i++, j++

i=2, j=2時

『a』 = 『a』

arr[2] == brr[2] , 所以i++, j++

i=3, j=3時

『a』 != 『b』

所以j=next[j]=next[3]=2;i不變

i=3, j=2時

『a』 = 『a』

arr[3] == brr[2] , 所以i++, j++

i=4, j=3時

『b』 = 『b』

arr[4] == brr[3] , 所以i++, j++

因為i >= strlen(arr),迴圈結束

並且j >= strlen(brr) 說明找到啦

返回子串第一次出現的位置 i-strlen(brr)

就是現在 i 代表的位置是標準串中『b』的位置,我們減去子串的長度,就是子串第一次出現的位置

我們可以發現當子串與標準串不同的時候(我們記當前標準串的字母為arr[index] );子串會整體移動;移動到子串從後往前看,子串第一次和arr[index]相等的位置。 我們會發現移動後的子串還是會和標準串相匹配。next表工作就是這個 這需要讀者自己理解一下。

KMP 模式串匹配演算法

這兩天讀了july的kmp,覺得很受益,寫下以作備忘。kmp最重要的就是求出next陣列,而next陣列則是通過不斷比較 str2 k 與 str2 j 來確定下乙個字元對應的 next數值 相等則直接next j k 不相等則令k next k 進行遞推直到出現 str2 k str2 j 相等的...

串 KMP模式匹配演算法

樸素模式匹配演算法就是簡單的二重迴圈,第一重迴圈主串s從1到n,然後第二重迴圈子串t從1到m進行匹配判斷,時間複雜度為o n m 1 m kmp演算法的核心思想是 第一 如果子串前r個字元均不相等,且子串前r個字元與主串某連續的r個字元匹配,但子串第r 1就不匹配了,則主串的匹配下標可以直接向前跳r...

模式串匹配 KMP演算法

kmp是對字首暴力搜尋的改進,基於的想法其實是很樸素的。首先我們來看一下暴力搜尋。char bf char src,char pattern else if pattern temp 0 return src else return null 如果匹配失敗,則將關鍵字向右滑動乙個字元,從頭開始匹配關...