模式匹配----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算法(Brute-Force算法),也称为朴素匹配算法,是一种简单直观的字符串匹配算法。它的基本思想是从主串的第一个字符开始,依次与模式串的每个字符进行比较,如果匹配成功,则继续比较下一个字符,否则主串指针后移一位,重新开始匹配。这个过程类似于暴力破解密码的过程,因此也被称为暴力匹配算法。 下面是BF算法的C语言实现: ```c #include <stdio.h> #include <string.h> int BF(char* s, char* p) { int i = 0, j = 0; int s_len = strlen(s); int p_len = strlen(p); while (i < s_len && j < p_len) { if (s[i] == p[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j == p_len) { return i - j; } else { return -1; } } int main() { char s[] = "hello world"; char p[] = "world"; int pos = BF(s, p); if (pos != -1) { printf("匹配成功,位置为:%d\n", pos); } else { printf("匹配失败\n"); } return 0; } ``` 在上面的代码BF函数接受两个参数,分别是主串s和模式串p。在函数,我们使用两个指针i和j分别指向主串和模式串的第一个字符,然后依次比较它们的字符是否相等。如果相等,则继续比较下一个字符,否则主串指针后移一位,重新开始匹配。如果模式串匹配成功,则返回匹配的位置,否则返回-1。 需要注意的是,BF算法的时间复杂度为O(m*n),其m和n分别为主串和模式串的长度。因此,当主串和模式串的长度较大时,BF算法的效率会比较低。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值