문자열 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;
}

좋은 웹페이지 즐겨찾기