KMP模式匹配算法




朴素模式匹配

串的模式匹配指的是子串在主串中的定位匹配,例如主串A = “abcdef”,子串B = “cd”,那么子串与主串的第三、四位相同。
思路:
(1)首先应该让主串的第一位与子串的第一位对比,相等则对比第二位,否则子串向后移一位,子串第一位与主串第二位对比。
(2)子串的第一位依次与主串的第1-5位匹配对比。

/****************************************\
*输入:char Fat[]--主串,char Son[]--子串
*输出:无
*返回:匹配成功的位置,不成功则返回-1
\****************************************/
int Index(char Fat[], char Son[])
{
   
    int i = 0;
    int j = 0;

    int FLen = strlen(Fat);//获取主串和子串的长度
    int SLen = strlen(Son);

    while ((i < FLen) && (j < SLen)) //当子串和主串均未匹配完
    {
   
        if (Fat[i] == Son[j]) //当前字符相同,则匹配下一位字符
        {
   
            i++;
            j++;
        }
        else
        {
    /*当前字符不相同,下一个应该匹配的应该是,上次主串匹配的
            下一位字符i-j+2(上次主串匹配的前一个字符位置:i-j)。
            子串下次匹配应该重新是第0位*/
            i = i - j + 2;
            j = 0;
        }
    }

// 匹配结束,如果子串匹配完最后一位,则匹配成功。
//否则,此时是主串已经全部匹配完,没有找到相同的部分,匹配失败
    if (j == SLen)
    {
   
        return (i - j);
    }
    else
    {
   
        return -1;
    }
}


KMP模式匹配

KMP模式匹配,主要是分析子串的字符相似度,减少没有必要的匹配。
例如主串A = “abcdefg”,子串B = “abcx”,在dx匹配失败后,没有必要从主串的b,c开始匹配了,因为前三位匹配成功,但子串b,c均不与首字符相同,则主串相应位置也不会相同。

另一种是子串相似度较高的情况,例如主串A = “abababc”,子串B = “ababc”,在第一次匹配失败后,不需要再从主串的第1,2,3位开始匹配,而是直接对主串的第4位a和子串的第2位a进行匹配。
匹配样例

因为子串B的第0-1字符与2-3字符相同,且子串B与主串A前4个字符相等,那么主串A的2-3字符自然与子串B的0-1字符相等,只要从主串的第4位和子串的第2位开始比较即可。

匹配时,主串的匹配位置是不回溯的,而子串的匹配位置是会回溯的,因此用next数组表示对应的位置匹配失败时,回溯的位置。

数学表达式如下:
n e x t [ j ] = { − 1 j = 0 M a x { k ∣ 0 < k < j ,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法(Knuth-Morris-Pratt算法)是一种用于解决字符串匹配问题的高效算法。它的主要思想是利用匹配失败时的信息,尽量减少比较次数,提高匹配效率。 KMP算法的核心是构建一个部分匹配表(Partial Match Table),也称为Next数组。这个表记录了在匹配失败时应该将模式串向右移动的位置。 构建部分匹配表的过程如下: 1. 首先,将模式串中的第一个字符的Next值设为0,表示当匹配失败时,模式串不需要移动; 2. 然后,从模式串的第二个字符开始,依次计算Next值; 3. 当第i个字符与前面某个字符相同的时候,Next[i]的值为该字符之前(不包括该字符)的相同前缀和后缀的最大长度; 4. 如果不存在相同的前缀和后缀,则Next[i]的值为0。 有了部分匹配表之后,KMP算法匹配过程如下: 1. 用i和j来分别表示模式串和主串的当前位置; 2. 如果模式串中的字符和主串中的字符相同,那么i和j都向右移动一位; 3. 如果模式串中的字符和主串中的字符不同,那么根据部分匹配表来确定模式串的下一个位置; 4. 假设当前模式串的位置为i,根据部分匹配表中的值Next[i],将模式串向右移动Next[i]个位置; 5. 重复上述步骤,直到找到匹配或者主串遍历完毕。 KMP算法的时间复杂度为O(m + n),其中m和n分别是模式串和主串的长度。相比于暴力匹配算法的时间复杂度为O(m * n),KMP算法能够大幅减少比较次数,提高匹配效率。 综上所述,KMP模式匹配算法通过构建部分匹配表并利用匹配失败时的信息,实现了高效的字符串匹配。在实际应用中,KMP算法被广泛地应用于文本编辑、数据搜索和字符串处理等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值