#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int * geNext(char *pucPatternStr)
{
int iPatternLen;
int *piNext;
int iCnti;
int iCntj;
iCnti = 0;
iCntj = -1;
iPatternLen = strlen(pucPatternStr);
piNext = (int*)malloc(iPatternLen*sizeof(int));
*piNext = -1;
while (iCnti < iPatternLen-1)
{
if ((-1 == iCntj) || (pucPatternStr[iCnti] == pucPatternStr[iCntj]))
{
/* 每当自增iCnti,iCntj得到一个新的piNext[iCnti] */
iCnti++;
iCntj++;
piNext[iCnti] = iCntj;
}
else
{
iCntj = piNext[iCntj]; /* 模式串向右移动 */
}
}
return piNext;
}
int KMPSearch(char * pucTextStr, char * pucPatternStr)
{
int iTextLen;
int iPatternLen;
int *piNext;
int iTextIndex;
int iPatternIndex;
iTextLen = strlen(pucTextStr);
iPatternLen = strlen(pucPatternStr);
piNext = geNext(pucPatternStr);
iTextIndex = 0;
iPatternIndex = 0;
while ((iPatternIndex < iPatternLen) && (iTextIndex < iTextLen))
{
if ((-1 == iPatternIndex) || (pucTextStr[iTextIndex] == pucPatternStr[iPatternIndex]))
{
iTextIndex++;
iPatternIndex++;
}
else
{
iPatternIndex = piNext[iPatternIndex]; /* 模式串向右移动 */
}
}
if (NULL != piNext)
{
free(piNext);
}
if (iPatternIndex == iPatternLen) /* 匹配成功 */
{
return (iTextIndex - iPatternLen);
}
return 1;
}
int main()
{
char *pucTextStr = "abcabaabcab";
char *pucPatternStr = "abaa";
int iRet;
iRet = KMPSearch(pucTextStr, pucPatternStr);
printf("%d\n", iRet);
return 0;
}
KMP算法
最新推荐文章于 2022-11-03 21:50:23 发布