【数据结构与算法】字符串匹配 - 暴力算法

【数据结构与算法】字符串匹配 - 暴力算法

通过CTRL + F查找文本这种操作相信每个人都有,在一段文本中查找另外一段文本,这个操作就叫做字符串的模式匹配,比如在AABABCDEF中查找ABCD,那么AABABCDEF被叫做文本串(也叫主串),ABCD被叫做为模式串,通常主串的长度使用N来表示,模式串的长度使用M来表示,上面两个串的匹配情况如下图所示:
匹配
正如上图绿色部分那样,文本串中包含模式串,结果就是匹配到了。

字符串模式匹配的算法有很多,比如暴力算法、KMP算法、BM算法、BK算法等,一一来介绍。

BF算法

BF算法也叫做暴力算法,思路简单,很容易理解,首先将文本串和模式串左对齐,如果出现不匹配的情况,则模式串整体向后移动一位,否则就匹配了,依然拿下图来说明:
匹配

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

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

红色处字符也不相等,则继续向后移动模式串,重新匹配:
在这里插入图片描述
红色处字符也不相等,则继续向后移动模式串,重新匹配:
在这里插入图片描述

此时找到了匹配结果。

通过上面的图解分析,其实能够很好地总结出匹配的步骤:

  1. 循环文本串,文本串中的当前字符(当前指针指向的字符)开始向后以此与文本串比较。
  2. 比较的时候,如果遇到字符不相等的情况,那么就需要停止比较,文本串指针需要向后移动一位,继续与模式串比较(从模式串头开始以此比较)
  3. 如果与模式串的所有字符以此比较都相等,那么说明匹配到了。

按照上面的分析,我可以定义一个指针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还是回到头部

第三次匹配:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值