为庆祝8-1建军节,研究了一下KMP算法,顺便写个程序验证下。
/**
* Created: 2011-8-1
* By: eeorange
* About: KMP -- 参考书籍:数据结构(C语言版)-严蔚敏-吴伟民编著
*/
#include <iostream>
#include <string>
using namespace std;
typedef unsigned int uint;
// 生成 next[]
void init_kmp(const string& s, int next[])
{
next[0] = -1;
int i = 0, j = -1;
while(i+1 < (int)s.size())
{
if(j == -1 || s[i] == s[j]) next[++i] = ++j;
else j = next[j];
}
}
// 返回查找的下标,失败返回-1
int kmp_find(const string& s, const string& p)
{
static int* next = NULL;
if(next) delete[] next;
next = new int[(int)p.size()];
init_kmp(p, next);
int i=0, j=0;
for(;;){
if(j == (int)p.size()) return i-j; // find return
if(i == (int)s.size()) return -1; // not found, return -1
if(s[i] == p[j]) {i++; j++;}
else if(j == 0) i++;
else j = next[j];
}
}
int main(){
string s = "ababcabcacbab";
string p = "abca";
cout << "S:" << s << endl;
cout << "P:" << p << endl;
cout << kmp_find(s, p) << endl;
return 0;
}