字首:必須包含第乙個元素但不能包含最後乙個;
字尾:必須包含最後乙個元素但不能包含第乙個;
(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串的第...