首页 > 编程语言 > 详细

KMP算法字符串匹配

时间:2015-03-29 20:59:09      阅读:204      评论:0      收藏:0      [点我收藏+]

对于暴力搜索法,当搜索词对应的字符与字符串中的字符不匹配时。将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把”搜索位置”移到已经比较过的位置,重比一遍。

应用KMP算法之后,则有:
=?
技术分享
“部分匹配值”就是”前缀”和”后缀”的最长的共有元素的长度。

KMP算法实现代码如下

void prefixFun(char *pattern, int *preFun)
{
    int len = 0; //length of pattern
    while (‘\0‘ != pattern[len])
        len++;

    int LOLP = 0; //length of longest prefix
    preFun[1] = 0;
    for (int NOCM = 2; NOCM <= len; NOCM++) //NOCM : number of characters matched
    {
        while (LOLP > 0 && pattern[LOLP] != pattern[NOCM-1])
            LOLP = preFun[LOLP];
        if (pattern[LOLP] == pattern[NOCM-1])
            LOLP++;
        preFun[NOCM] = LOLP;
    }
}

void KMPstrMatching(char *target, char *pattern)
{
    int tarLen = 0;
    int patLen = 0;
    while (‘\0‘ != target[tarLen])
        tarLen++;
    while (‘\0‘ != pattern[patLen])
        patLen++;

    int *preFun = new int[patLen+1];
    prefixFun(pattern, preFun);

    int NOCM = 0; // number of characters matched

    for (int i = 0; i < tarLen; i++)
    {
        while (NOCM > 0 && pattern[NOCM] != target[i])
            NOCM = preFun[NOCM];
        if (pattern[NOCM] == target[i])
            NOCM++;

        if (NOCM == patLen)
        {
            cout<<"Pattern occurs with shift "<<i - patLen + 1<<endl;
            NOCM = preFun[NOCM];
        }
    }

    delete [] preFun;
}

KMP算法字符串匹配

原文:http://blog.csdn.net/foreverling/article/details/44730669

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!