关于kmp算法

字符串匹配算法简称kmp

日常安利大佬博客(真的是一篇很好的文章)

 

 觉得百度百科讲的也挺好

就是给出两个字符串a, b

求b在a中的所有位置

next数组:代表当前字符之前的字符串中,有多大长度的相同前缀后缀(都指自己本身)

 

 对于求next数组我们考虑b字符串自己匹配自己

        lb = strlen (b + 1);
    for (int i = 2; i <= lb; i++) {
        while(j && b[j + 1] != b[i]) j = next[j];
        if(b[j + 1] == b[i]) j++;
        next[i] = j;
    }

 

例题

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int next[2333333];
int la, lb, j;
char a[2333333], b[2333333];
int main () {
    cin >> a + 1;
    cin >> b + 1;
    la = strlen (a + 1);
    lb = strlen (b + 1);
    for (int i = 2; i <= lb; i++) {
        while(j && b[j + 1] != b[i]) j = next[j];
        if(b[j + 1] == b[i]) j++;
        next[i] = j;
    }
    j = 0;
    for (int i = 1; i <= la; i++) {
        while (j && b[j + 1] != a[i]) 
            j = next[j];
        if (b[j + 1] == a[i])j++;
        if (j == lb) {
            printf ("%d\n", i - lb + 1);
            j = next[j];
        }
    }
    for (int i = 1; i <= lb; i++) 
        printf ("%d ", next[i]);
    return 0;
}

 

转载于:https://www.cnblogs.com/yanxiujie/p/11621298.html

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值