模式匹配----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算法。

如果小伙伴还没看懂可以在评论区留言,我会在评论区给你解答!
如有错误之处还请各位指出!!!
那本篇文章就到这里啦,下次再见啦!

在这里插入图片描述

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值