今天重温了KMP算法,总算是彻底搞明白了,以前看KMP算法的时候总是似乎懂了,又不是彻底懂了。
看了一些博客,总结下面可以从3个层次来理解KMP算法:
1.是比较好懂的是前后缀法
参考网站:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
2.其次是有穷自动机法
参考网站:https://niuye.info/fms-kmp/
3.经典算法解读法
参考网站:http://www.cnblogs.com/yjiyjige/p/3263858.html
自己实践了一下代码如下
#include "KMP.h"
void KMP::__getNext(std::string& viPattern, std::unique_ptr<int[]>& viNext)
{
int k = -1;
int i= 0;
viNext[i] = -1;
while ((unsigned int)i < (viPattern.length()-1))
{
if (k == -1 || viPattern[i] == viPattern[k])
{
viNext[++i] = ++k;
}
else
k = viNext[k];
}
}
int KMP::KMPSearch(std::string& viPattern, std::string& viTotalString)
{
using namespace std;
unique_ptr<int[]> NextArray(new int[viPattern.length()]);
__getNext(viPattern, NextArray);
int i = 0, k = 0;
while ((unsigned int)i < viTotalString.length()&&k<viPattern.length())
{
if (viPattern[k] == viTotalString[i] || k == -1)
{
++k;
++i;
}
else
{
k = NextArray[k];
}
}
if (k == viPattern.length())
return i - k;
else
return -1;
}