数据结构之字符串匹配算法(BF算法和KMP算法)

本文介绍了字符串匹配算法中的BF算法和KMP算法,详细解释了两种算法的工作原理,并通过实例展示了如何计算KMP算法中的next数组。BF算法时间复杂度为O(mn),而KMP算法的时间复杂度优化到了O(m+n)。文章还提供了手动计算next数组的方法及KMP算法的公式推导,同时给出了代码实现。
摘要由CSDN通过智能技术生成

字符串匹配算法: 就是给定两个串,主串(s)和子串(sub), 查找子串是否在主串里面,如果找到便返回子串在主串中第一个元素的位置下标,否贼返回-1,。 在这里我
们讨论的时候主要用字符串来举例实现。 总共有两个算法,分别为BF算法和它的优化算法KMP算法
首先我们来讲一下BF算法,BF 算 法 即 朴 素 算 法 :它 的 实 现 方 式 是 这 样 的 , 假 定 我 们 给 出 字 符串 ”ababcabcdabcde”作为主串, 然后给出子串: ”abcd”,现在我们需要查找子串是否在主串中出现, 出现返回主串中的第一个匹配的下标, 失败返回-1;
这里写图片描述
我们看上图,这是两个字符串,上面是主串,下面是子串,BF算法的基本原理用绿字写在旁边,大家可以动手画一下来体会这个过程。
那么,我用代码来实现一下BF算法函数:

int BF(Str *s,Str *sub,int pos)
{
    if(pos<0||pos>s->length)
    {
        return -1;
    }

    int i = pos;//pos是传的参数,表示从主串的那个位置开始匹配
    int j = 0;

    int lens = s->length;
    int lensub = sub->length;

    while (i < lens && j < lensub)//进入while的条件是标记i和j都没有走完主串和子串
    {
        if (s->elem[i] == sub->elem[j])//字符相等
        {
   
            i++;
            j++;
        }
        else//字符不相等
        {
            i = i - j + 1;//让i回到开始位置加1
            的地方,继续匹配
            j = 0;//让j指向子串的0号下标
        }
    }
    if (j >= lensub)//这里做一个判断,j>=lensub的情况下就是在主串中找到了子串,就返回i-j,i是pos位置,减去j等于走了一个子串的长度。
        {
            return i - j;
        }
        else 
            return -1;
}

其实它函数就这么一点,很简单,很好理解。BF函数有三个参数,分别是主串(s),子串(sub)和从那个位置开始查找的一个整型变量(pos)。注释很详细。

KMP 算法: 相对于 BF 算法来说 KMP 算法更为高效, 原因在于 BF 算法的时间复杂度是:
O(mn),M 代表主串的长度, n 代表子串的长度。 而 KMP 的话, 时间复杂度就变为 O(m+n);接下来我们看一下, 具体的实现过程, 还是一样, 我们举例来看: KMP 和 BF 唯一不一样的地方在,主串的 i 并不会回退到开始的位置加1的地方, 并且 j 也不会移动到 0

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值