KMP 字符串匹配算法

本文介绍了KMP字符串匹配算法,对比了它与暴力匹配(BF)算法的区别。KMP算法利用已匹配信息,通过构造next数组来决定匹配失败后的位移。详细阐述了next数组的构造方法和字符串匹配过程,并提供了C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设s1是待进行匹配的字符串,s2是具体匹配串。eg:s1 = "fegeahellodfskaf",s2 = "hello"。

相较于BF(Brute Force)算法,KMP算法利用了已匹配字串信息。它的实现方式分为两步,第一步,构造next数组;第二步,根据next数组决定后移位数,进行匹配。

1.构造next数组。

next数组是存储s2字串的最长前后缀长度信息的数组。eg:对于字符串“abcabd”,next[]存储的内容分别是[-1,0,0,0,1,2]。next[5]表示s2前面5个字符的最长前后缀长度,前缀为“ab”,后缀为"ab"。

next数组C语言实现方式:


void getnext(char *s2, int * next, int len){ // 传入参数分别是 s2 字符串 ,next 数组,s2字符串长度
    int k = 0; // k表示前一次比较最长前后缀长度
    next[0] = -1;
    next[1] = 0;
    for (int i = 2; i<len; i++){
            if(k==0){ // 说明前一次最长前后缀长度为0,所以只需要比较第一个和最后一个字符
                if(s2[k]==s2[i-1]) k = 1;
            } else {
                if(s2[k]==s2[i-1]) k=k+1; // 继续比较是否能有更长的最长前后缀
                else{
                        //没有更长的前后缀,前后缀大小会变小,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值