串的模式匹配一般有两种算法:分别为BF算法和KMP算法。
其中BF算法也叫暴力算法:
需要注意的是BF算法在失配之后主串回溯到i=i-j+2;模式串回溯到j=1
用 BF 算法定位模式串在主串中的位置,就是简单粗暴的从主串的起始位置开始,不断地将模式串中的字符和主串中的字符进行对比。
具体来讲,假设对模式串 A("abcac")和主串 B("ababcabacabab")进行模式匹配,BF 算法的执行过程如下:
1) 将模式串 A 与主串 B 的首字符对齐,逐个判断相对的字符是否相等,如图 1 所示:
图 1 串的第一次模式匹配示意图
2) 图 1 中,由于模式串 A 与主串 B 的第 3 个字符匹配失败,此时将模式串 A 后移一个字符的位置,采用同样的方法重新匹配,如图 2 所示:
图 2 串的第二次模式匹配示意图
3) 图 2 中可以看到,两个串依旧匹配失败,模式串 A 继续后移一个字符的位置,如图 3 所示:
图 3 串的第三次模式匹配示意图
4) 图 3 仍然匹配失败,模式串 A 继续向后移动,一直移动至图 4 的位置才匹配成功:
图 4 串模式匹配成功示意图
从图 1 到图 4,模式串 A 与主串 B 共匹配了 6 次才成功,最终定位到模式串 A 位于主串 B 第 6 的位置处,整个模式匹配的过程就称为 BF 算法。
至于kmp算法则较为复杂些:
鉴于次,本文不再对此进行细致的讲解,只分享一下next【j】和nextval数组的求解方法,需要详细学习的请前往以下链接:
(48条消息) 数据结构KMP算法配图详解(超详细)_哈顿之光的博客-CSDN博客
下面则是nextval数组的求解:
其中,这之间的是字符和字符之间的比较
至此,串的模式匹配已经告一段落,希望自己在忘记的时候及时回来复习。
2023/5/22距离考试仅剩两周不到的时间,希望考试顺利