字符串匹配——BM算法(C/C++)
字符串匹配——BM算法(C/C++)
BM算法: 坏字符与好后缀。
BM算法坏字符#
描述:从右往左遍历,找到第一个不同的位置,然后查找模式串中第一个与该位置相同的字符,然后将两个位置对齐。
如果后面有已经匹配的部分子串,则查找模式串前是否有已经匹配的部分子串,若找到则对齐这匹配的子串。
极端情况,坏字符一直出现在结尾。好结尾一直不出现!退化为暴力搜索。
程序语言描述:
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算法——好后缀#
描述:从右往左匹配,找到坏字符(意味着坏字符后面的串是匹配的,即该串为好后缀),往左寻找模式串中是否还存在好后缀,若有,将模式串右移到该位置与主串的好后缀对齐。
若模式串中再没有好后缀,则右移到好后缀的往右错一位的位置。
程序描述:
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/
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请 .
如果,您希望更容易地发现我的新文章,不妨点击一下绿色通道的【关注我】。
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请 .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南