模式匹配----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算法的主要内容,如果未能解决你的问题,请参考以下文章

BF字符串匹配算法

数据结构串---BF算法(朴素模式匹配)

数据结构19: BF算法(普通模式匹配算法)

串匹配模式中的BF算法和KMP算法

字符串的模式匹配: BF算法

串的普通的模式匹配算法(BF算法)