字串匹配 KMP

2021-10-07 16:19:52 字數 1394 閱讀 5923

字首:必須包含第乙個元素但不能包含最後乙個;

字尾:必須包含最後乙個元素但不能包含第乙個;

(1)最大公共前字尾:滿足字首和字尾長度和元素對應相等條件下長度最長的前字尾;

(2)nex

t[i]

next[i]

next[i

]:字串中以i

ii為結尾的那段所擁有的最大公共前字尾的長度,根據前字尾定義當只有乙個元素時nex

tnext

next

陣列值為0;

給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。

模板串p在模式串s中多次作為子串出現。

求出模板串p在模式串s中所有出現的位置的起始下標。

輸入格式:

第一行輸入整數n,表示字串p的長度。

第二行輸入字串p。

第三行輸入整數m,表示字串s的長度。

第四行輸入字串s。

輸出格式:

共一行,輸出所有出現位置的起始下標(下標從0開始計數),整數之間用空格隔開。

資料範圍:

1≤n≤105

1≤m≤106

輸入樣例:

3aba

5ababa

輸出樣例:

0 2求next陣列的過程就是相當於把模板串也當成乙個主串,然後求模板串和這個時候主串對應的匹配關係,如果匹配了,主串中對應的下標i對應到模板串中的j+1

j+1j+

1,就相當於滑動之後可以直接從j+1

j+1j+

1開始進行匹配。

j =n

e[j]

j=ne[j]

j=ne[j

]:當模板串和主串不匹配時(此時主串下標為i

ii,模板串下標為j

jj,比較的是s[i

]s[i]

s[i]

和p [j

+1]p[j+1]

p[j+1]

),j往回跳再次進行匹配。

#include

using

namespace std;

const

int n =

1e6+10;

int n, m, ne[n]

;char s[n]

, p[n]

;int

main()

//模板串和主串進行匹配

for(

int i =

1, j =

0; i <= n; i++

)return0;

}

kmp字串匹配

首先要對模式串進行預處理。預處理過程就是計算出指定位置的字首和字尾的最大相同的長度 啊啊啊啊。估計只有我乙個人能看懂 這個文章說得很清楚 比如說 a a a c b c a a a 0 1 2 0 0 0 1 2 3 void getnext int next,char par 20 int n 翻...

字串匹配 KMP

參考 從頭到尾徹底理解kmp 在字串 str 中 匹配模式串 pattern 1.計算模式串的 next 陣列 2.在字串中匹配模式串 當乙個字元匹配時,str i pattern k 繼續匹配下乙個字元 當當前字元不匹配時,根據 next 陣列移動模式字串,k next k next 陣列 描述模...

KMP字串匹配

判斷s中是否含有字串t。一般思路為 從s中首字元開始,依次與t中進行比對,直到t結尾或者某乙個位置兩者不同 如果到t的結尾,則表示s中含有t。如果有乙個位置不相同,那麼從s中下乙個字元開始,再次與t中字元比對。如下 i 0,j 0 for i len 這樣的比較,每一次遇到不同的時候都需要從t串的第...