6. 数据结构与算法--KMP算法

本文介绍了KMP算法,一种避免回溯的字符串匹配算法。通过分析BF算法的不足,KMP算法通过next数组记录模式串前移的增量,直接推进匹配状态,提高效率。文章详细解释了next数组的计算过程,并给出了匹配过程的例子。
摘要由CSDN通过智能技术生成

前言

BF算法:

例如有下面两个数组 i  (主串)和数组 j(模式串),他们的第0位置存放字符串的长度,第1个位置开始存放数据。要比较字符串j 是否存在于字符串i中:BF算法如下。

  • 先将i[1] 与 j[1]的字符进行比较,比较ASCII码的大小,如果大小相同,则i和j都同时比较下一个位置i[2] 和 j[2]的字符,依次类推。

  • 在比较到i[5]和j[5]的时候, 发现i[5]不等于j[5],那么就让数组i取第2个位置 (即i[2])和 j[1]开始从头比较,发现i[2] 和 j[1]也不同,就让i[3]和j[1]开始比较,依次类推。

  • 若是过程中发现j的字符串存在于i中,则返回true; 若全部推完之后,没有发现j存在于i中,返回false;

比较之后,发现两个字符不匹配,再把主串位置移动到下一个位置,模式串的位置为0, 这种方式也叫“回溯”

代码:

#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct
{
    char* ch;
    int length;
}str;
int BF(char S[], char T[])
{
    int i = 0, j = 0;
    int index = 0;
    while ((S[i]!='\0')&&(T[j]!='\0'))
    {
        if (S[i] == T[j]) //匹配成功,i j都往后移动
        {
            ++i;
            ++j;
        }
        else
        {
            //如果匹配不成功,主串和子串回溯坐标。 index记录的是每次匹配时的开始位置
            ++index;
            i = index;
            j = 0;
        }
    }
    if (T[j] == '\0')//匹配成功,此时index+1刚好就是指向这轮比较在主串中的初始位置
    {
        return index + 1;
    }
    else
        return 0;
}

int main()
{
    char T[255]="nook";
    char S[255]="nonokkknook";
    int k;
    k = BF(S, T);
    cout << "模式串在主串的位置为:";
    cout << k << endl;
}

 

 

2.KMP算法

从BF算法中可知,有许多不必要的回溯,那么什么是不必要的呢?又应该怎么操作呢?

 

例如:下图有主串S, 模式串T, 主串S的位置由 i 表示,模式串的位置由 j 表示

这里的不匹配,发生在主串的第5个位置上,我们之后需要将i往后移

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值