【数据结构与算法】字符串匹配 - 暴力算法
通过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
还是回到头部
第三次匹配: