重温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& 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 NextArray(new int[viPattern.length()]);
	__getNext(viPattern, NextArray);
	int i = 0, k = 0;
	while ((unsigned int)i < viTotalString.length()&&k


你可能感兴趣的:(c++算法)