热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KMP算法最详细分析!!

1.首先明确,next数组存在的意义是什么:示例如下:主串:ababcabcacbab模式串:abcac匹配过程如下
1.首先明确,next数组存在的意义是什么:

示例如下:

主串:  a b a b c a b c a c b a b

模式串: a b c a c

匹配过程如下:

第一次匹配:

这个时候,如果不用KMP,而是用BF,那么我们的做法很明显:

尝试模式串的第一个字符和主串的第二个字符进行匹配。

很明显,这是多余的,这是肯定不成立的,而next数组直接告诉我们,跳过这一步,直接如下

这就是next的作用,如果还不明显,你再看上图,模式串的第五位是c和主串相对位置的b不匹配,那么按照BF算法,我们需要

再用主串的第四位和模式串的第一位比较,但是,很舒服,next数组告诉我们不用这样,直接如下

以上就是next的作用,跳过无用的匹配。

2.思考,next为什么可以这样做呢?

首先,什么是next数组:

上述模式串的next数组如下:

a b c a c

0 1 1 1 2

简而言之,每个字母x对应的next数组值是这样的出来的:x前的子串和主串的前几个字母相同,则只需要比较x和主串的第y个元素就好了,那么这个y就是next[x的索引]的值。

下面引入求next数组的算法:

next存储起始从1开始

void GetNext(string s,int next[])//s是模式串

{

    int i=1,j=0;next[1]=0;

    while(i

        if(j==0||s[i]==s[j]){

            i++;j++;

            next[i]=j;

        }

        else{

            j=next[j];//这一步很关键,他起到的作用就是刚才上面讲到的配对失败之后,直接跳到指定的位置

        }

    }

}

既然已经得到next数组了,那么实际操作就很简单了,附上KMP代码:

int KMP(string s,string t,int pos)//参数分别是主串,模式串,求模式串在主串第pos个字符之后的位置

{

    int i=pos,j=1;

    while(i

        if(j==0||s.data[i]==t.data[j]){

            i++;j++;//均后移一位

        }

        else j=next[j];//找到适当的位置

    }

    if(j>t.length())return i-t.length();//匹配成功

    else return -1;

}


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
author-avatar
JY哥在世
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有