非常容易理解的KMP字符串匹配算法转载过来记录一下

本文主要是介绍非常容易理解的KMP字符串匹配算法转载过来记录一下,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.cnblogs.com/maybe2030/p/4633153.html 写的非常明白,留个记录,需要的可以直接进去看

代码记录,getNext就是算那个“部分匹配值”编码的序列,也就是该文中的这个图

查询的直接可以根据这个编码进行跳跃式的查询减少多余匹配的消耗,移动位数 = 已匹配的字符数 - 对应的部分匹配值,下面对应代码记录下“部分匹配值”的计算过程:搜索词是ABCDABD

第一次,进到if中  i = 0 j = 0   next[1] = 0

第二次,走else     i = 1  j = -1  

第三次,进到if中  i = 2  j = 0   next[2] = 0

第四次,走else     i = 2  j = -1

第五次,进到if中  i = 3  j = 0   next[3] = 0

第六次,走else     i = 3  j = -1

第七次,进到if中  i = 4  j = 0   next[4] = 0

第八次,进到if中  i = 5  j = 1   next[5] = 1

第九次,进到if中  i = 6  j = 2   next[6] = 2

第十次,走else     i = 6  j = -1

第十一次,进到if中  i = 7  j = 0   next[7] = 0

到此计算完ABCDABD的部分匹配序列next=【0,0,0,0,1,2,0】

void getNext(const std::string &p, std::vector<int> &next)
{next.resize(p.size());next[0] = -1;int i = 0, j = -1;while (i != p.size() - 1){//这里注意,i==0的时候实际上求的是next[1]的值,以此类推if (j == -1 || p[i] == p[j]){++i;++j;next[i] = j;}else{j = next[j];}}
}int kmp(const std::string& s, const std::string& p, const int sIndex = 0)
{std::vector<int>next(p.size());getNext(p, next);//获取next数组,保存到vector中int i = sIndex, j = 0;while(i != s.length() && j != p.length()){if (j == -1 || s[i] == p[j]){++i;++j;}else{j = next[j];}}return j == p.length() ? i - j: -1;
}

 

这篇关于非常容易理解的KMP字符串匹配算法转载过来记录一下的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076999

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优