重溫KMP算法

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章