情况,BM(BoyerMoore)采取从模式串末端往前匹配的算法,简称BM算法。实现这个算法首先是求出模式串的
extb数组值,然后进行模式匹配。(1)求
extb数组值基本思想:把模式串中每个字符(称ch)至模式串最末尾字符的距离(若模式串中有相同的字符,只记下离尾端最近的那个字符的距离)分别存放到每个字符所对应的
extbch中,不在模式串中出现的字符,其
extbch值为模式串长m。
extbchm或
extbordchmmaxj1≤j≤m1且pjch为讨论的简单起见,设串都是小写字母,例如有模式串P=abcdcfd,长度m=7,其
f
extb数组中值如表所示。其中
extbg至
extbz的值均为7。chabcdefghz
extbch652371777算法:typecararrayazofi
teger;procedure
extb(pstri
g;var
extbcar);varichar;jmi
teger;begi
mp_le
gth;foriatozdo
extbim;forj1tom1do
extbpjmj;e
d;(2)BM匹配算法基本思想:从模式串P尾端字符和主串S相对应位字符开始比较,若相等则继续往前(向左)逐个比较,否则将串P右移
extbch位(此处ch是模式串P尾端字符相对应主串S中的相应字符),然后从P的尾端字符和S中相对应的字符重新开始比较,若相等则继续往前比,依此类推,直至最后匹配成功或失败为止。【例】714↓↓S:aytuklmabopwac
eabcdcfdhs
fP:abcdcfdP右移7位后:P右移2位后:abcdcfdabcdcfd
P右移7位后:abcdcfdhs算法如下:fu
ctio
BM_match(spstri
g;
extbcar)i
teger;varijkm
i
teger;begi
mp_le
gth;
s_le
gth;im;repeatjm;ki;while(j0)a
d(skpj)dobegi
jj1;kk1;e
d;ifj0the
ii
extbsi;u
til(j0)or(j
);ifj0the
BM_matchim1elseBM_match0;e
d;§413串的广义匹配设主串S和模式串P,按模式串中字符顺序在主串中顺序找到但不一定连续与模式串相同的字符序列,称之为广义匹配。广义匹配具有许多的用途,如数据库的模糊查询等。例如:主串Sacdacbem模式串PdcbSacdacbemPdcb显然有S3S5S6=P1P2P3参考算法如下,它主要适用于ASCII码字符和汉字字符。programgypp;varpsstri
g;ijki
teger;darray1260ofi
teger;Begi
writeP;readl
p;writeS;readl
S;
fi1;j0;whileile
gthsifpj1sithe
begi
dobegi
jj1;dji;ii1;e
delseii1;e
d;ifj0the
writel
Nofi
delsefork1tojdowritedk3;E
d
r