KMP匹配算法是用于匹配字符串的经典算法,对KMP的详解或教程我就不写了,自认写不好。推荐两个自己认为不错的链接给想了解的朋友:
1、介绍的很详细:http://www.cppblog.com/oosky/archive/2006/07/06/9486.html
2、看大多数教程都理解不了KMP的同学,看下这篇:http://www.kuqin.com/algorithm/20080721/11844.html
贴上我的代码吧,C++实现。
#include <iostream> using namespace std; //next生成函数 void KMP_next(int *next,const char * t) { int i =0; int j =-1; next[0] =-1; const int tlen =strlen(t); while(i<tlen-1) { if(j==-1 || t[i]==t[j]) { j++;i++;next[i] =j; } else { j=next[j]; } } } //匹配函数 int KMP(const char * src, const char* t) { const int slen=strlen(src); const int tlen=strlen(t); int *next = new int[tlen]; KMP_next(next, t); int i =0,j=-1; while(i<slen&&j<tlen) { if(j==-1 || src[i] ==t[j]) i++,j++; else j = next[j]; } if(next) delete []next; if(j>=tlen) return (i-j); else return -1; } int main() { char src[15] ="ababdababababe"; char t[6] ="ababe"; cout<<KMP(src,t)<<endl; system("pause"); return 0; }
对于会的朋友来说,代码比较清晰了,很容易懂,对于还没理解的同学,可能仅看代码不容易看出头绪!可以看看别的详解之类的文章!
这里需要提一点,就是在调试程序的过程(VS2010),delete []next 的时候总是崩溃,后来找到原因是访问next数组的时候越界了,但不明白的是越界访问怎么会影响到后来的delete操作,我的猜想是:在new int[MAX]时,分配的空间不止MAX个单位大小,会在其后增加些许信息,delete释放内存时,会使用这些信息。由于越界访问将这些“信息”擦除了,所以会导致delete的失败。
不过对于这一猜想还需要继续验证,如果有朋友了解,望赐教! 当然,上面的程序已经将越界问题优化掉了!
仅以此文记录学习路程及对自己的鼓励!