KMP算法

来源:互联网 发布:算法交易策略 编辑:程序博客网 时间:2024/06/16 16:28
#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;}

原创粉丝点击