KMP字符匹配算法

Posted dukelv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP字符匹配算法相关的知识,希望对你有一定的参考价值。

上个假期就学了KMP,但是基本不用,所以忘干净了。。。这个的核心思想就是next数组,next数组学名叫最长相同前缀后缀。还不错的算法,KMP

匹配的过程中比原来的暴力匹配多了一个跳来跳去的next。

下面有一个链接:从头到尾KMP,写的很棒,很好懂!

贴板子代码:(自己写的注释,有可能不对,欢迎指出)

#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int next[1000005];
char s[1000005];//s为匹配串 
char t[1000005];//t为文本串 
int ans[1000005];//记录答案 
int main()
{
    scanf("%s%s",t + 1,s + 1);//从1开始存 
    int ls = strlen(s + 1);
    int lt = strlen(t + 1);
    int k = 0;//k为所匹配到的最大的后缀
    next[1] = 0;
    for(int i = 2;i <= ls;i++)//开始匹配s,建next数组 
    {
        while(k != 0&&s[i] != s[k + 1])  //后缀不相等则回到next[k] 
        k = next[k];
        if(s[i] == s[k + 1])k++;  //后缀相等 
        next[i] = k;
    }
    k = 0;
    int num = 0;
    for(int i = 1;i <= lt;i++)//开始匹配文本串 
    {
        while(k != 0&&t[i] != s[k + 1])
        k=next[k];
        if(t[i] == s[k + 1])k++;
        if(k == ls)//如果文本串中都已经匹配到s了,记录答案 
        {
            num++;
            ans[num] = i - ls + 1;
        }
    }
    for(int i = 1;i <= num;i++)
    printf("%d
",ans[i]);
    for(int i = 1;i <= ls;i++)
    printf("%d ",next[i]);//输出答案 
    return 0;
}

 

以上是关于KMP字符匹配算法的主要内容,如果未能解决你的问题,请参考以下文章

kmp匹配

数据结构—串KMP模式匹配算法

KMP(字符串匹配算法)

KMP算法解决字符串匹配问题(详细步骤图解)

字符串模式匹配KMP算法

KMP字符串匹配算法