只经过初步验证
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;
}