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;}