【数据结构与算法】字符串匹配 - 暴力算法
通过CTRL + F查找文本这种操作相信每个人都有,在一段文本中查找另外一段文本,这个操作就叫做字符串的模式匹配,比如在AABABCDEF中查找ABCD,那么AABABCDEF被叫做文本串(也叫主串),ABCD被叫做为模式串,通常主串的长度使用N来表示,模式串的长度使用M来表示,上面两个串的匹配情况如下图所示:

正如上图绿色部分那样,文本串中包含模式串,结果就是匹配到了。
字符串模式匹配的算法有很多,比如暴力算法、KMP算法、BM算法、BK算法等,一一来介绍。
BF算法
BF算法也叫做暴力算法,思路简单,很容易理解,首先将文本串和模式串左对齐,如果出现不匹配的情况,则模式串整体向后移动一位,否则就匹配了,依然拿下图来说明:

两个串左对齐开始匹配,如下图:

红色处字符不相等,则停止比较后面的字符,将整个模式串向后移动,再次匹配:

红色处字符也不相等,则继续向后移动模式串,重新匹配:

红色处字符也不相等,则继续向后移动模式串,重新匹配:

此时找到了匹配结果。
通过上面的图解分析,其实能够很好地总结出匹配的步骤:
- 循环文本串,文本串中的当前字符(当前指针指向的字符)开始向后以此与文本串比较。
- 比较的时候,如果遇到字符不相等的情况,那么就需要停止比较,文本串指针需要向后移动一位,继续与模式串比较(从模式串头开始以此比较)
- 如果与模式串的所有字符以此比较都相等,那么说明匹配到了。
按照上面的分析,我可以定义一个指针i指向文本串,定义一个指针j指向模式串:
第一次匹配:

本次匹配,以为i = 0, j = 0开始匹配,当j = 1的时候字符不匹配(text[i + j] != pattern[j]),也就是text[1] != pattern[1],接下来指针i要向后移一位,而指针j则需要设置为0,继续匹配。
第二次匹配:

匹配以i = 1开始,当j = 2的时候字符不匹配text[i + j] != pattern[j],也就是text[3] != pattern[2],此时指针i需要继续向后移动一位,指针j还是回到头部
第三次匹配:

匹配以i = 2开始,当j = 0的时候字符不匹配text[i + j] != pattern[j],也就是text[2] != pattern[0],此时指针i需要继续向后移动一位,指针j还是回到头部
第三次匹配:

匹配以i = 3开始,找到了模式串,但是j还是会向后移动的,此时j等于模式串的长度m。
代码如下:
class Solution {
pu

最低0.47元/天 解锁文章
1518

被折叠的 条评论
为什么被折叠?



