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

2619

被折叠的 条评论
为什么被折叠?



