模式匹配----BF算法
Posted 可乐不解渴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模式匹配----BF算法相关的知识,希望对你有一定的参考价值。
每一个不曾起舞的日子,都是对生命的辜负。
前言
给定两个字符串S=“s1、s2、…、sn”和T=“t1、t2、…、tm”。在主串中S寻找子串T的过程称为模式匹配(pattern matching),T称为模式(pattern)。如果匹配成功,返回T在S中的位置;如果匹配失败,返回0。
模式匹配常用于文本处理、杀毒软件、操作系统、数据库系统以及搜索引擎(比如:百度),模式匹配是使用很频繁的操作。
BF概念
BF算法的基本思想就是暴力求解,即从主串S的第一个字符开始和模式串T的第一个字符进行比较。如果相等,则继续比较两者的后续字符;否则,从主串S的下一个字符开始和模式T的第一个字符重新进行比较。
动图演示
BF算法是运用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串T匹配到 j 位置,则有:
- 如果当前字符匹配成功(即S[i] == T[j]),则i++,j++,继续匹配下一个字符;
- 如果不匹配(即S[i]! = T[j]),令i =++start,j = 0。相当于每次匹配失败时,i 回溯到++start,j 回溯为0。
BF代码
int BF(string S, string T)
{
//防止如果主串或者子串任意一个为空,就不需要查找了。还有当子串的长度大于主串就代表一定不匹配,不匹配就返回-1
if (S.size() == 0 || T.size() == 0 || S.size() < T.size())
{
return -1;
}
//强制类型转换,分别得到主串S的长度,和子串T的长度
int sLen = static_cast<int>(S.size());
int tLen = static_cast<int>(T.size());
int i = 0,j=0; //i为主串的遍历下标 j为子串的遍历下标
int start = 0; //回溯下标
while (i<sLen&&j<tLen)
{
if (S[i] == T[j]) //如果相同,主串与子串一起++
{
++j;
++i;
}
else //如果不相同,则让主串回溯到++start位置,因为start位置是上一轮的回溯下标
//j就重新回到0下标,之后就重新开始匹配
{
i = ++start;
j = 0;
}
}
if (j >= tLen) //如果j>=tlen就是以及匹配成功了,其实这里的j不可能大于tlen,这里用==也可以
{
return i - j;
}
else //不匹配返回-1
{
return -1;
}
}
效率
在最好的情况下,每趟不成功的匹配都发生在子T的第一个字符。在等概率情况下,平均的比较次数是:O(n+m)。
在最坏的情况下,每趟不成功的匹配都发生在子串T的最后一个字符。最坏的情况下时间复杂度为O(m*n)。
优缺点:BF算法虽然简单,但是效率较低,在下篇博客中我将讲述一种对BF算法做了很大改进的模式匹配算法KMP算法。
如果小伙伴还没看懂可以在评论区留言,我会在评论区给你解答!
如有错误之处还请各位指出!!!
那本篇文章就到这里啦,下次再见啦!
以上是关于模式匹配----BF算法的主要内容,如果未能解决你的问题,请参考以下文章