字串模式匹配的兩大經典演算法。
概念:主串,又稱目標串
子串,又稱模式串
模式匹配就是在主串中匹配模式串。
模式串的next陣列求法:
next陣列下標從1開始
next[j] 值為模式串前j-1個字元最長相等前字尾長度+1
next[1]=0
串本身不能作為前字尾
模式匹配失敗時,next陣列規定了模式串向後滑動的位數
例題:p='aabaac'
next=
假設\(t[i]≠p[j]\)導致失配 。若\(p[j]==p[next[j]]\),此時模式串移動\(next[j]\)必然也會失配,改進用nextval陣列代替next陣列:
nextval[1]=0;
for(j>1;j<=n;j++)
if(p[j]==p[next[j]])
nextval[j]=nextval[next[j]];
if(p[j]≠p[next[j]])
nextval[j]=next[j];
設目標串t,模式串為p
對於模式串p,計算\(charjump[x]\)和\(matchjump[k]\),即壞字元和好字尾;
將t與p的第乙個字元對齊。t與p從右向左的逐字元比較,直至找到乙個不匹配字元或者p中所有字元都匹配成功;
若出現失配,即存在\(t[i]≠p[k]\),此時壞字元\(x=t[i]\),好字尾\(p'=p[(k+1) … (len(p)-1)]\)
按如下規則計算目標串t中查詢指標向右移動的距離\(dist[i]\):
若\((i+dist[i])≤len(t)-1\),則移動模式字串p,使之與\(t[i+dist[i]]\)右對齊,重複step2;否則,認為t中不存在與p匹配的子串,返回匹配失敗。
例題:若模式串為"abcadb",則
t中查詢指標的移動距離dist=模式串p的移動距離shift+好字尾的長度
matchjump陣列初始化
\(matchjump[k]=len(p)-k-1+len(p)\)
\(matchjump[len(p)-1] = 1\)
其中\(k∈[0,len(p)-2]\)
即模式串中字元到模式串尾距離+模式串長度
若存在好字尾,則依據「好字尾規則 」,重新調整\(matchjump[k](k∈[0,len(p)-2])\) (假定:好字尾p』為p[k+1]…p[len(p)-1] )
例1:
例2:
例3:
字串匹配演算法之KMP演算法和BM演算法
本文主要介紹kmp演算法和bm演算法,它們分別是字首匹配和字尾匹配的經典演算法。所謂字首匹配是指 模式串和母串的比較從左到右,模式串的移動也是從左到右 所謂字尾匹配是指 模式串和母串的的比較從右到左,模式串的移動從左到右。看得出來字首匹配和字尾匹配的區別就僅僅在於比較的順序不同。下文分別從最簡單的字...
python實現BM和KMP演算法
1.kmp演算法 def compute prefix function p m len p pi 0 m k 0for q in range 1,m while k 0 and p k p q k pi k 1 ifp k p q k k 1pi q k return pidef kmp matc...
模式匹配 KMP演算法
字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...