串的模式匹配

来源:互联网 发布:系统集成软件有哪些 编辑:程序博客网 时间:2024/04/30 06:24

        以前每次看到字符串匹配,一律跳过,今天耐着性子研究了下,依旧是半混沌状态,先整理放在这,以备后用。这篇文章帮助很大,朴素匹配算法&KMP算法,收藏先。

1. 朴素匹配算法

int PatternMatch_Common(const char *pString, const char *pPattern){    if (0==pString || 0==pPattern)    {        return -3;    }    if ('\0'==*pString || '\0'==*pPattern)    {        return -2;    }    int lengthOfString=strlen(pString), lengthOfPattern=strlen(pPattern);    int indexOfString=0, indexOfPattern=0;    while (indexOfString<lengthOfString&&indexOfPattern<lengthOfPattern)    {        if (pString[indexOfString]==pPattern[indexOfPattern])        {            ++indexOfString;            ++indexOfPattern;        }        else        {            indexOfString=indexOfString-indexOfPattern+1;            indexOfPattern=0;        }    }    if (indexOfPattern==lengthOfPattern)    {        return indexOfString-lengthOfPattern;    }    else return -1;}


2.KMP算法

真心懂得不彻底,就记住一句话:在P[0~j-1]中找一个最长真前缀使得它等于P[0~j-1]的最长真后缀,把这个长度值放进pNext[j]

void GetNext(const char *pPattern, int *pNext){    int k=-1, j=0, length=strlen(pPattern);    pNext[0]=-1;    while (j<length)    {        if (-1==k || pPattern[k]==pPattern[j])        {            ++k;            ++j;            pNext[j]=k;        }        else        {            k=pNext[k];        }    }}int PatternMatch_KMP(const char *pString, const char *pPattern, const int *pNext){    if (0==pString || 0==pPattern)    {        return -3;    }    if ('\0'==*pString || '\0'==*pPattern)    {        return -2;    }    int lengthOfString=strlen(pString), lengthOfPattern=strlen(pPattern);    int indexOfString=-1, indexOfPattern=-1;    while (indexOfString<lengthOfString&&indexOfPattern<lengthOfPattern)    {        if (-1==indexOfPattern || pString[indexOfString]==pPattern[indexOfPattern])        {            ++indexOfString;            ++indexOfPattern;        }        else        {            indexOfPattern=pNext[indexOfPattern];        }    }    if (indexOfPattern==lengthOfPattern)    {        return indexOfString-lengthOfPattern;    }    else return -1;}


原创粉丝点击