KMP 單模式串快速匹配

2021-10-19 08:42:01 字數 1413 閱讀 2123

開始從重新學字串了,改過自新吧…

洛谷p3375 【模板】kmp字串匹配

定義模式串為b

bb,文字串為a

aa(很長)

假如我們處理出了乙個b

bb的kmp

kmpkm

p陣列其中k mp

[i

]kmp[i]

kmp[i]

表示[ 1,

i]

[1,i]

[1,i

]中的最長公共前字尾,有什麼辦法加速匹配嗎??

比如匹配

a=abcacababcab

b=abcab

比如現在匹配到第五位,發現b[5

]!=a

[5

]b[5]!=a[5]

b[5]!=

a[5]

,怎麼辦??把b

bb右移一位繼續匹配??

實際上,我們可以直接右移三位

abcacababcab

abcab

為什麼??感性理解就是前後有字母相同,不需要再重複比較

因為k mp

[4]=

1kmp[4]=1

kmp[4]

=1,所以可以直接匹配從模式串的第二個字元開始嘗試匹配。。。

int j =0;

//初始模式串匹配位置為0

for(

int i=

1;i<=n;i++

)//匹配成功

}

如何處理kmp

kmpkm

p陣列??原理一樣,讓模式串自己匹配自己即可

int j =0;

//當前匹配到低第幾位

for(

int i=

2;i<=m;i++

)

模板

#include

using

namespace std;

const

int maxn =

2e6+10;

char a[maxn]

,b[maxn]

;int n,m,kmp[maxn]

;void

kmp(

) j =0;

for(

int i=

1;i<=n;i++)}

for(

int i=

1;i<=m;i++

)printf

("%d "

,kmp[i]);

}int

main()

KMP(單模式匹配)

單字串匹配,返回匹配位址 求出匹配總次數 求迴圈元,t len next len next陣列的有效範圍是 0,len len的時候,next為有效值 只需要記住next 0 1,next 1 0,這兩個條件就可以寫出求next的函式 匹配過程只需要o n 所以i的值不需要回歸。這裡曾經糾結很久,m...

單模式字串匹配演算法KMP

kmp演算法 2int kmp char s,file file,int pos 3 else 否則,下標指向當前字元的前乙個匹配項 12i next i 13if i 1 17 18 if s i 0 else 否則返回 1 22 return 1 23 獲得模式串的next陣列演算法 演算法中c...

KMP 單模式匹配, 實現 strStr

knuth morris pratt演算法 kmp 單模式匹配,判斷s1是否是s2的子串 原理 通過乙個輔助函式next 實現跳過不必要的目標字串,已達到優化效果 時間複雜度 o m n 主要思想 在失配之後,並不簡單的從目標串的下乙個字元開始新一輪的檢測,而是依據在檢測之前得到的有用資訊,直接跳過...