KMP算法

只经过初步验证


int* getKmpNext(const char * cPatternStr)
{
int dwLength = strlen(cPatternStr);
int * pNextArr = new int[dwLength];

pNextArr[0] = 0;


int * pPriorValue = pNextArr;
int * pCurValue = pNextArr + 1;

for(int i = 1; i < dwLength; ++i, ++pPriorValue, ++pCurValue)
{
//如果前一个是真的话
if(*pPriorValue)
{
//
if(cPatternStr[i] == cPatternStr[*pPriorValue])
*pCurValue = *pPriorValue + 1;
else
*pCurValue = 0;
}
else
{
if(cPatternStr[i] == cPatternStr[0])
*pCurValue = 1;
else
*pCurValue = 0;
}
}
return pNextArr;
}


int getSameNum(const char * cSrcStr, const char * cPatternStr)
{
char * cSrcChar = (char *)cSrcStr;
char * cDesChar = (char *)cPatternStr;
int dwSameNum = 0;
while(cSrcChar && cDesChar && *cSrcChar && *cDesChar && *cSrcChar == *cDesChar)
{
++cSrcChar;
++cDesChar;
++dwSameNum;
}
return dwSameNum;
}


int findString(const char * cSrcStr, const char * cFindStr)
{
char * cSrcChar = (char *)cSrcStr;
int dwPatternLength = strlen(cFindStr);
int dwSameNum = 0;


int * cNextArr = getKmpNext(cFindStr);


while(*cSrcChar != '\0')
{
dwSameNum = getSameNum(cSrcChar, cFindStr);
//找到相同的
if(dwSameNum == dwPatternLength)
return cSrcChar - cSrcStr;
//
else if(dwSameNum)
cSrcChar += (dwSameNum - cNextArr[dwSameNum - 1]);
else
++cSrcChar;
}


delete[]cNextArr;
return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值