すのはら荘春原庄的雪

目录

  1. 字符串匹配——BM算法(C/C++)
    1. BM算法坏字符#
    2. BM算法——好后缀#

字符串匹配——BM算法(C/C++)

Toretto·2022-03-26 10:44·297 次阅读

字符串匹配——BM算法(C/C++)

字符串匹配——BM算法(C/C++)

BM算法: 坏字符与好后缀。

BM算法坏字符#

描述:从右往左遍历,找到第一个不同的位置,然后查找模式串中第一个与该位置相同的字符,然后将两个位置对齐。

如果后面有已经匹配的部分子串,则查找模式串前是否有已经匹配的部分子串,若找到则对齐这匹配的子串。

极端情况,坏字符一直出现在结尾。好结尾一直不出现!退化为暴力搜索。

程序语言描述:

Copy
highlighter-hljs
int BMstring_BC(char *S, char *T){
int lenT = strlen(T);
int lenS = strlen(S);
int i,j,k;
for(i=0;i<lenS;){
for(j=lenT-1,k=0;j>=0;j--)
if(T[j]!=S[i+j])
break;
if(j==-1)
return i;
for(k=j;k>=0;k--)
if(T[k] == S[i+k])
break;
i += j-k;
}
return -1;
}

BM算法——好后缀#

描述:从右往左匹配,找到坏字符(意味着坏字符后面的串是匹配的,即该串为好后缀),往左寻找模式串中是否还存在好后缀,若有,将模式串右移到该位置与主串的好后缀对齐。

若模式串中再没有好后缀,则右移到好后缀的往右错一位的位置。

程序描述:

Copy
highlighter-hljs
int BMstring_GG(char *S, char *T){
int lenT = strlen(T);
int lenS = strlen(S);
int i,j,k;
for(i=0;i<lenS;){
for(j=lenT-1,k=0;j>=0;j--)
if(T[j] != S[i+j])
break;
if(j==-1)
return i;
char demo[lenT-j];
for(int t=j;t>=0;t--)
demo[j-t] = T[t];
k = BMstring_GG(T, T+j);
if(k == 0){
i += lenT-j;
continue;
}
i += j-k+1;
}
return -1;
}


作者:Mengjie Ye
出处:https://ymj68520.cnblogs.com/

如果,您希望更容易地发现我的新文章,不妨点击一下绿色通道的关注我

如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请            .
posted @   ymj68520  阅读(297)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
分享到:
目录

打赏

>>

欢迎打赏支持我 ^_^

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示