KMP算法

在看string的find函数时,本来想看看find的效率如何,突然发现kmp算法有点忘了,做个笔记。

看了几个blog感觉不是很有感觉(主要是标号和我学的不一样,不习惯),看了严蔚敏的视频,把感觉找回来了。

next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度+1。

找了严蔚敏的几个测试实例测了一下,发现全对,说明我对next函数了解了。

 

随便贴个代码:

//next[0] 初始化为-1 next[1]初始化为0
//next[j]的值就是j之前字符串与最开始字符串的最长匹配字符串的长度。
//也就是说比严蔚敏示例的next值都小1,比较符合字符串从0开始的习惯。
#include<iostream>
using namespace std;

void getnext(char s2[],int next[])
{
    memset(next,0,sizeof(next));
    int i=-1,j=0;
    next[0]=-1;
    while(j<strlen(s2))
    {
        if(i==-1||s2[i]==s2[j])
        {
            i++; 
            j++;  
            next[j]=i;
        }
        else 
            i=next[i];
    }
}

int KMP(char s1[],char s2[],int next[])
{
    int i=0,j=0,len1=strlen(s1),len2=strlen(s2);
    while((i<len1)&&(j<len2))
    {
        if(j==-1||s1[i]==s2[j])
        {
            i++;
            j++;
        }
        else 
            j=next[j];
    }
    if(j==len2) 
        return i-len2;
    else 
        return -1;
}

void main()
{
    char s1[200] = "aaaabbbbaabaaabaaaabbbbb",s2[200] = "aabaaabaaaab"; //-1 0 1 0 1 2 2 3 4 5 6 2
    int next[200];
    getnext(s2,next);
    for (int i = 0; i<12; i++)
    {
        cout<<next[i]<<" ";
    }
    cout<<endl;
    cout<<KMP(s1,s2,next)<<endl;
    system("pause");
}

  

posted on 2015-04-12 20:05  大宴天下  阅读(238)  评论(0编辑  收藏  举报