一招教你看懂KMP算法next数组

简介: 一招教你看懂KMP算法next数组

给两个字符串,一个匹配串,一个主串,我们要在主串中找到第一个匹配串,并全部返回 eg: p="aba"; s="bbabaca"; 那么返回的就是第一个找到的匹配串的下标 返回2; 这里最容易想到的就是暴力匹配了,挨个,依次匹配。

核心代码:

for(int i = 1; i <= n; i++) {
    bool flag = true;
    for(int j = 1; j <= m;j++) {
        if(s[i+j-1] != p[j]) {
            flag = false;
            break;
        }        
    }
}

但这样的时间复杂度太高了,两层for循环,直接O(n*m)了,那么我们应该如何去优化呢,我们可以利用已知的信息来减少匹配次数,这就是kmp算法了


先给出kmp匹配的代码:

for(int i=1,j=0;i<=m;i++)
    {
        while(j&&b[j+1]!=a[i]) j=ne[j];
        if(b[j+1]==a[i]) j++;
        if(j==n)
        {
            printf("%d ",i-n);
            j=ne[j];
        }
    }

i是指向字符串S的,j是指向字符串P的

ne数组存的就是匹配码

这里先给出ABCDABD的匹配码0 0 0 0 1 2 0

对于图中蓝色框框都是已经匹配成功的信息,但红色框框匹配不成功,那么我们可以利用字符串P的匹配码来减少匹配,ne[j]=1;

下次匹配的时候直接从s[1+1]开始(这里的数组下标从1开始),但AC和AB又不匹配了,ne1=0,下次从s1开始匹配

最后匹配成功。


那么如何获得这个ne数组呢?

先给出匹配代码


for(int i=2,j=0;i<=n;i++)
    {
        while(j&&b[i]!=b[j+1])j=ne[j];//退而求其次重新匹配
        if(b[i]==b[j+1])j++;
        ne[i]=j;
    }

这就相当于找对称字符的最长长度了

比如ababf这个字符串

我们将其拆分为

a

ab

aba

abab

ababf

对于a没有对称的字符,所以匹配码是0

ab也没有,匹配码是0

aba有,a和a,匹配码是1

abab也有,ab和ab,匹配码是2

ababf没有,匹配码是0

对于aba和abab,在我们已经知道aba已经对称的情况下,我们只需要确定这两个b是否匹配就行了,所以可以利用上一次匹配的信息,a已经匹配了,所以直接找b即可,匹配规则为下图红字部分


匹配规则样例枚举:

image.png

image.png

目录
相关文章
|
6月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
5月前
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
167 0
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
137 0
|
8月前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
147 7
|
9月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
531 23
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
230 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
163 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
算法
第四章 KMP算法理论基础
第四章 KMP算法理论基础
244 0
|
算法
KMP算法
KMP算法
147 0

热门文章

最新文章