kmp思路想法

文章介绍了KMP算法如何优化字符串匹配过程,通过构建ne[]数组来避免暴力匹配中的重复比较,提高效率。在匹配过程中,当出现不匹配时,利用ne[]数组的信息调整模板串的位置,减少无效的比较。最终给出C++代码示例进行演示。
摘要由CSDN通过智能技术生成

题目描述 题目链接

  

题目分析

(kmp用于匹配字符串)
主要思想:
现在有两个字符串s[] p[],s[]为匹配串,p[]为模板串,我们需要在s[]中找到p[]串。

当我们用暴力做法时,我们会定义 i 和 j 两个指针分别指向s,p 用一个双重循环疯狂匹配,时间复杂度是很恐怖的。

kmp算法定义了一个ne[] ne[]数组会告诉我们以下信息,当s[j+1]!=p[i]时按照暴力做法模板串会像右边移动一格,
然后j从1开始继续匹配,现在如果有人告诉你p[]中j——ne[j]已经与s[i]之前的匹配成功,我们只需要继续判断s[i]是否与
p[j+1]相等,如果相等j,i继续匹配,否则继续递归的找ne[i],当j=0的时候意思是当s[i]之前的都无法与p[j]匹配
所以i++,j=0,继续试图匹配。

代码展示

#include<iostream>

using namespace std;

int const N=1e5+10,M=1e6+10;
int n,m,ne[N];
char p[N],s[M];

int main()
{
    cin>>n>>p+1>>m>>s+1;

    for(int i=2,j=0;i<=n;i++)
    {
        while(j&&p[j+1]!=p[i]) j=ne[j];
        if(p[j+1]==p[i]) j++;
        ne[i]=j;
    }

    for(int i=1,j=0;i<=m;i++)
    {
        while(j&&p[j+1]!=s[i]) j=ne[j];
        if(p[j+1]==s[i]) j++;
        if(j==n)
        {
            cout<<i-n<<" ";
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道古九封

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值