字符串之KMP算法

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

//参考文档
//http://blog.csdn.net/v_july_v/article/details/7041827
/*
注释:
	字符串分为原始串和模式串
	模式串进行匹配时需要计算next数组,计算next数组需要先计算前缀后缀最大公共元素长度,得到长度数组右移一位
*/

bool isSame(const char* pStart,const char* pEnd,int nIndex)
{
	for(int i=0;i<=nIndex;i++)
	{
		if(*(pStart + i) != *(pEnd + i))
		{
			return false;
		}
	}
	return true;
}

int	 kmpNextArrNode(const char* pstr,int nIndex)
{
	for(int i=0;i<nIndex;i++)
	{
		if(isSame(pstr,pstr+nIndex-i,i) == true)
		{
			return i+1;
		}
	}
	return 0;
}

void kmpNextArr(const char* pstr,int nSize,int* pNextArr)
{
	pNextArr[0] = -1;
	for(int i=0;i<nSize-1;i++)
	{
		pNextArr[i+1] = kmpNextArrNode(pstr,i);
	}
}

int kmpComput(const char* pstrS,int nSizeS,const char* pstrT,int nSizeT)
{
	//next数组
	int* pNextArr = new int[nSizeT];
	kmpNextArr(pstrT,nSizeT,pNextArr);

	//进行匹配
	int nIndex = -1;
	for(int i=0,j=0; i< nSizeS;)
	{
		if(pstrS[i] == pstrT[j] || j == -1)
		{
			i ++;
			j ++;
		}
		else
		{
			j = pNextArr[j];
		}

		if(j == nSizeT)
		{
			nIndex = i - nSizeT;
			break;
		}
	}
	//删除
	delete pNextArr;
	return nIndex;
}



你可能感兴趣的:(字符串之KMP算法)