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) 编辑 收藏 举报