今天重溫了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;
}