码迷,mamicode.com
首页 > 编程语言 > 详细

KMP字符匹配算法

时间:2018-07-21 11:51:49      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:数组   com   class   不用   中比   next   kmp   有一个   turn   

上个假期就学了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;
}

 

KMP字符匹配算法

标签:数组   com   class   不用   中比   next   kmp   有一个   turn   

原文地址:https://www.cnblogs.com/DukeLv/p/9345527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!