簡單複習一下KMP演算法(模式匹配)

2021-08-29 22:48:22 字數 1758 閱讀 5724

kmp演算法用來做什麼[1

,n

]a[1,n]

a[1,n]

是否為字串b[1

,m

]b[1,m]

b[1,m]

的子串,並求出a

aa在b

bb中各次出現的位置。

關於雜湊求解

由於雜湊代替各種字串的做法比較固定,此處不做介紹。

kmp演算法的小複習

f ai

l[i]

fail[i]

fail[i

]表示「a

aa中以i

ii結尾的非字首子串」與「a

aa的字首」能夠匹配的最長長度,即:

f ai

l[i]

=max

,j

a[i−

j+1,

i]=a

[1,j

]fail[i]=max\,jfa

il[i

]=ma

x,ja[i−

j+1,

i]=a

[1,j

]

fail[1]=0;

for(int i=2,j=0;i<=n;i++)

f[i

]f[i]

f[i]

表示「b

bb中以i

ii結尾的子串」與「a

aa的字首」能夠匹配的最大長度,即:

f [i

]=ma

x,j≤

i,b[

i−j+

1,i]

=a[i

,j

]f[i]=max\,j\leq i,b[i-j+1,i]=a[i,j]

f[i]=m

ax,j

≤i,b

[i−j

+1,i

]=a[

i,j]

for(int i=1;j=0;i<=m;i++)
放在一起就得到最後的kmp演算法:

#include #include #include #include #include #define db double

#define sg string

#define ll long long

#define rel(i,x,y) for(ll i=(x);i<(y);i++)

#define rep(i,x,y) for(ll i=(x);i<=(y);i++)

#define red(i,x,y) for(ll i=(x);i>=(y);i--)

#define res(i,x) for(ll i=head[x];i;i=nxt[i])

using namespace std;

const ll n=1e6+5;

const ll inf=1e18;

const db eps=1e-10;

char a[n],b[n];ll n,m,f[n],fail[n];

inline ll read()

while(ch>='0'&&ch<='9')

return f?-x:x;

}void kmp()

for(int i=1,j=0;i<=m;i++)

} for(int i=1;i<=n;i++) printf("%lld ",fail[i]);

}int main()

KMP匹配演算法複習。。

kmp演算法 knuth morris pratt algorithm knuth就是高德納。kmp演算法是從樸素匹配演算法改進而來 就是窮搜匹配。樸素匹配演算法 原串 abcde 模式串 acd 1.將原串和模式串左對齊,然後一位一位比較,直到有乙個字元不匹配 2.發現第二位的b和c不匹配,模式串...

簡單模式匹配演算法和KMP演算法

參見原文 簡單模式匹配演算法 經典的模式匹配,是讓模式串的首字元從主串的首字元開始向右匹配。匹配的規則是 1.在主串的第i個位置,讓pos i,如果主串pos位置的字元等於模式串的第乙個字元,則pos 再與模式串的第二個字元進行匹配。2.如果又相等則繼續向下匹配,直到匹配到模式串的結尾,就說明主串中...

模式匹配 KMP演算法

字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...