KMP算法字符串匹配

简介: 对于暴力搜索法,当搜索词对应的字符与字符串中的字符不匹配时。将搜索词整个后移一位,再从头逐个比较。这样做虽然可行,但是效率很差,因为你要把”搜索位置”移到已经比较过的位置,重比一遍。应用KMP算法之后,则有: 移动位数=已匹配的字符数−对应的部分匹配值移动位数 = 已匹配的字符数 - 对应的部分匹配值 “部分匹配值”就是”前缀”和”后缀”的最长的共有元素的长度。KM

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

应用KMP算法之后,则有:
=
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;
}
目录
相关文章
|
1月前
|
算法
KMP算法
KMP算法
33 0
|
4月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
ccfcsp201409-3 字符串匹配
ccfcsp201409-3 字符串匹配
|
算法 Python
字符串匹配 - KMP算法
字符串匹配 - KMP算法
67 0
|
存储 算法 C语言
KMP 字符串匹配算法
✅<1>主页:C语言的前男友 📃<2>知识讲解:KMP算法 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 🏡<5>系统环境:Windows 10 💬<6>前言:KMP 算法是一个非常牛逼的字符串匹配算法
|
算法
字符串匹配——kmp算法
字符串匹配——kmp算法
|
算法
KMP算法的实现详解
KMP算法的实现详解
157 0
KMP算法的实现详解
|
算法 C++
C++ 实现KMP字符串匹配算法
C++ 实现KMP字符串匹配算法
|
算法
【21. KMP算法】
**思路:** - 因为BF算法是一位一位的比较,所以时间复杂度比较高,KMP是通过`减少比较次数,来进行优化`. - BF是匹配不成功只移动一位,而KMP算法匹配不成功,`移动多位`,具体移动几位,需要查`前缀表`。
112 0
【21. KMP算法】
|
C++
201409-3 字符串匹配
201409-3 字符串匹配
59 0
201409-3 字符串匹配
下一篇
无影云桌面