LouZhang

导航

KMP的个人理解

贴图什么的太麻烦了

看下K哥的博客吧:http://972169909-qq-com.iteye.com/blog/1114968

讲的很好啊,关于next数组的意义(当然我觉得他博客有点错误)

其实就是一个模式串在一个主串中查找

通过KMP可以快速找到要查找的位置,次数,长度等等。。。

暴力做法当然是O(m*n),用了KMP就是O(m+n)了

 

璐神的纯裸KMP(查找第一次出现的位置)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=1000001;
int i,j,k;
int len1,len2;
char s[inf],t[inf];
int next[inf];
void getnext(){
    next[0]=-1;
    next[1]=0;
    j=1;k=0;
    while(j<len2){
        if(t[j]==t[k]){
            next[j+1]=k+1;
            j++;
            k++;
        }
        else if(k==0){
            next[j+1]=0;
            j++;
        }
        else k=next[k];
    }
}
int kmp(){
    i=j=0;
    while(i<len1&&j<len2){
        if(s[i]==t[j]){
            i++;
            j++;
        }
        else if(j==0) i++;
        else j=next[j];
    }
    if(j>=len2) return i-len2;
    else return -1;
}
int main(){
    while(scanf("%s%s",s,t)!=EOF){
        len1=strlen(s);
        len2=strlen(t);
        getnext();
        printf("%d\n",kmp());
    }
}

posted on 2012-10-19 13:09  louzhang_swk  阅读(196)  评论(0编辑  收藏  举报