半年很久以前写过一个kmp,最近做题又回忆了一下,感觉以前代码真是青涩,温故而知新,现在对KMP又有了更深的理解,理解了每一个细节。
//============================================================================
//
// > File :
// > Author : flowertree
// > Time : 2015年12月13日
// > Algorithm : KMP
//
//============================================================================
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <string>
using namespace std;
int Next[10];
void kmp_next(string sub) //KMP求next数组改进版
{
int len = sub.size();
int i = 0;
Next[0] = -1;
int j = -1;
while(i < len - 1)
{
if(j == -1 || sub[i] == sub[j])
{
i++;
j++;
if(sub[i] != sub[j])
Next[i] = j;
else
Next[i] = Next[j];
}
else
{
j = Next[j];
}
}
}
int kmp(string str, string sub) //KMP匹配算法
{
kmp_next(sub);
int lenstr, lensub;
lenstr = str.size();
lensub = sub.size();
int i, j;
i = 0;
j = 0;
while(i < lenstr)
{
if(j == -1 || str[i] == sub[j])
{
i++;
j++;
if(j == 0 && i > lenstr - lensub)
break;
if(j == lensub)
return i - lensub;
}
else
{
j = Next[j];
}
}
return -1;
}
int main()
{
string str = "asdfghjkl";
string sub = "dfghjkl";
int position = kmp(str, sub);
cout << "匹配位置在" << position << endl;
system("pause");
return 0;
}