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;
}
目录
相关文章
|
3月前
|
算法 C++ 索引
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
32 0
|
9月前
|
算法 Python
字符串匹配 - KMP算法
字符串匹配 - KMP算法
47 0
|
9月前
|
算法
字符串中的KMP算法及其改进
字符串中的KMP算法及其改进
|
8月前
|
存储 算法 C语言
KMP 字符串匹配算法
✅<1>主页:C语言的前男友 📃<2>知识讲解:KMP算法 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 🏡<5>系统环境:Windows 10 💬<6>前言:KMP 算法是一个非常牛逼的字符串匹配算法
|
9月前
1355:字符串匹配问题(strs)
1355:字符串匹配问题(strs)
|
9月前
|
算法 Linux
字符串-KMP算法
字符串-KMP算法
45 0
|
10月前
|
算法
KMP算法详解
KMP算法详解
90 0
KMP算法详解
|
11月前
|
算法
字符串匹配——kmp算法
字符串匹配——kmp算法
|
算法 C++
C++ 实现KMP字符串匹配算法
C++ 实现KMP字符串匹配算法

热门文章

最新文章