KMP算法笔记(C++)

本文介绍了KMP算法的需求和暴力解法,详细解析了如何通过构建next数组优化匹配过程,以及给出了C++实现的思路。通过分析前缀和后缀找出最大公共元素,确定不匹配时的跳转下标,从而提高搜索效率。
摘要由CSDN通过智能技术生成

要搞懂KMP算法首先要明白这个算法是用来做什么的。

需求

无耻的熟人xx:“欸~小上官,原来你(也)是个程序员,那帮我想想看……”
你:S.x.x.T,我连自己的内心活动都自带哔哔声和谐了,你还要我搞什么!
伟大的朋友xx:“……怎么从一串字符串里面搜索出想要的子串。搞得好的话……”,说着就掏出了手机打开了名城的,“把她/他介绍给你。”
你:“我不是那种人。”
高尚的好友xx:“加上这个。”
你:“这不太好。”
高尚无私且伟大的同志xx:“再加上这个。”
你:

在这里插入图片描述

“私聊。”

果然无人能抵抗苇名城的魅力。

回到正题,KMP算法可以用在查找字符串中的子串,即匹配字符串。什么是字串?例如“believe”中就有“lie”、“bitch”里面有“bit”,“lie”、“bit”就是子串,“believe”、“bitch”就是主串。我们定义子串在主串中的位置就是子串的第一个字符在主串中的序号。不过老婆/公饼里面真的没老婆/公。

在真的开始讲KMP之前我们先看下暴力解法。

暴力解法

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(needle.empty())
            return 0;
            
        int i=0,j=0;
        while(haystack[i]!='\0'&&needle[j]!='\0')
        {
            if(haystack[i]==needle[j])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+1;
                j=0;
            }
        }
        if(needle[j]=='\0')
            return i-j;
        
        return -1;
    }
};

上面这部分代码的作者是2227。haystack是主串,needle是子串,

其实这个算法叫BF算法(Brute Force)。原理很简单,就是每次子串和主串发现不匹配,那么将子串往前移一格,直到匹配或者移出边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值