您的位置:首页 > 其它

BF_KMP字符串匹配

2013-04-25 15:13 465 查看
#pragma once
class CSearchString
{
private:
CSearchString(void);
~CSearchString(void);

public:
static bool BF(const char *PArr1, int nArr1Size, const char *pArr2, int nArr2Size);

static int  KMP(const char *pSrcString, int nSrcLength, const char *pModeString, int nModeLength, int SearchPos);

private:
static int* NextPosArry(const char *pModeString, int nLength);
};


#include <Windows.h>
#include <assert.h>
#include "BF_KMP.h"

CSearchString::CSearchString(void)
{
}

CSearchString::~CSearchString(void)
{
}

bool CSearchString::BF( const char *pSrcString, int nSrcLength, const char *pModeString, int nModeLength )
{
assert(pSrcString != NULL && pModeString != NULL);
assert(nSrcLength > 0 && nModeLength > 0);

if (nSrcLength < nModeLength)
return false;

for (int i = 0; i < nSrcLength; i++)
{
for (int j = 0; j < nModeLength && pSrcString[j] == pModeString[i + j]; j++)
{
if (j == nModeLength - 1)
return true;
}
}

return false;
}

int CSearchString::KMP( const char *pSrcString, int nSrcLength, const char *pModeString, int nModeLength, int SearchPos )
{
int *pNextArry = NextPosArry(pModeString, nModeLength);

int i = SearchPos;
int j = 0;
while ( i < nSrcLength && j < nModeLength )
{
if( j == -1 || pSrcString[i] == pModeString[j] )
{
++i;
++j;
}
else
{
j = pNextArry[j];
}
}

delete []pNextArry;

if( j >= nModeLength )
return i-nModeLength;
else
return -1;
}

int* CSearchString::NextPosArry( const char *pModeString, int nModeLength )
{
if (pModeString == NULL || nModeLength <= 0)
return NULL;

//Next数组
int *pNextArry = new int[nModeLength];
if (pNextArry == NULL)
return NULL;

//初始化
int i		 = 0;
int j		 = -1;
pNextArry[0] = -1;

//循环求解
while (i < nModeLength - 1)
{
if (j == -1 || pModeString[i] == pModeString[j])
{
i++;
j++;

if (pModeString[i] != pModeString[j])
pNextArry[i] = j;
else
pNextArry[i] = pNextArry[j];
}
else
{
j = pNextArry[j];
}
}

return pNextArry;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: