KMP算法(字符串匹配)

KMP算法是一种字符串匹配算法,它的全称是Knuth-Morris-Pratt算法,由Donald E. Knuth、Vaughan R. Pratt和James H. Morris共同提出。

KMP算法解决的问题是在一个文本串S中查找一个模式串P的出现位置。传统的字符串匹配算法(如暴力匹配算法)的时间复杂度为O(n*m),其中n和m分别是文本串S和模式串P的长度。KMP算法通过预处理模式串P,实现了O(n+m)的时间复杂度。

KMP算法的核心思想是利用已经匹配过的部分信息来避免不必要的比较。在预处理模式串时,KMP算法会构建一个辅助数组next,其中next[i]表示模式串P在第i个位置之前的最长公共前后缀的长度。通过使用next数组,KMP算法可以在查找过程中跳过一些不可能匹配的位置,从而提高效率。

KMP算法的具体实现如下:
1. 根据模式串P构建next数组。
2. 初始化两个指针i和j,分别指向文本串S和模式串P的起始位置。
3. 当i和j都没有到达末尾时,进行以下操作:
   - 如果j=-1或者S[i]=P[j],则将i和j分别向后移动一位。
   - 否则,将j移动到next[j]的位置。
4. 如果j到达模式串P的末尾,则匹配成功,返回i-j作为模式串P在文本串S中的起始位置。
5. 如果i到达文本串S的末尾,仍然没有找到匹配的位置,则匹配失败。

KMP算法的时间复杂度为O(n+m),其中n和m分别是文本串S和模式串P的长度。由于KMP算法只对模式串P进行了预处理,因此适用于需要多次在同一文本串中查找不同模式串的情况。其空间复杂度为O(m)。

 

KMP算法效率更好,遍历一遍就可以找到匹配的字符串.那么算法是如何实现的呢???

#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
#define KUI ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
const int con = 2e5 + 5;
string p, s;
int ne[con];
void kmp(int len1, int len2)
{
    int k = 0, sum = 0;
    for (int i = 0; i < len1; i++)
    {
        while (k > 0 && p[k] != s[i])
        {
            k = ne[k - 1];
        }
        if (p[k] == s[i]) // 只有主串和查询串的元素相等,相等的长度加1
        {
            k++;
        }
        if (k == len2) // 如果主串和查询串等于,那就是主串里有一个完整的模式串
        {
            sum++;
            k = 0; // 不要忘了k归0
        }
    }
    cout << sum << endl;
}
int main()
{
    cin >> s >> p;
    int len1 = s.size(), len2 = p.size(); 
    int k = 0;
    // 求ne数组;
    for (int i = 1; i < len2; i++)
    {
        while (k > 0 && p[k] != p[i])
        {
            k = ne[k - 1];
        }
        if (p[k] == p[i])
        {
            k++;
        }
        ne[i] = k;
    }
    kmp(len1, len2);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值