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\n",ans[i]);
    for(int i = 1;i <= ls;i++)
    printf("%d ",next[i]);//输出答案 
    return 0;
}

 

posted @ 2018-07-21 08:56  DukeLv  阅读(179)  评论(0编辑  收藏  举报