前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 KMP 翻译过来叫"看毛片"的算法,因为大学的时候就学过它.听说到它的效率非常高.把原本字符串匹配效率 O(n*m) 缩短到了O(n+m),把✖️变成了➕,真是了不得. 每次我回顾 KMP 算法时,都会发现自己是个小白,或者每次回顾时,都发现上次因为回顾而写的总结居然是错的!所以为了学习快…
KMP算法主要解决字符串匹配问题,其中失配数组next很关键: 看毛片算法真是人如其名,哦不,法如其名. 看了这篇博客,转载过来看一波: 原博客地址:https://blog.csdn.net/starstar1992/article/details/54913261/ B站这个三哥的视频讲的蛮详细 void get_next(char *s) { next[0] = -1; /*next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀*/ int k = -1; /*k初始化为-1*…
数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Description 给定两个字符串string1和string2,判断string2是否为string1的子串. Input 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证…
以前刚学的时候迷迷糊糊的,一看就懵圈,前几天捡起来的时候 发现还不会 于是研究了两天,自尊心严重受挫,今天的时候  突然一道灵光迸发,居然 感觉好像懂了,于是又琢磨起来  终于  我懂了  呵呵!   0 1 2 3 4 5 6 7 8 9 主串   : a b c d  e a b c d  f         i 0 1 2 3 4 5 6 7 8 9 模式串:         c d f j i=4时 e!=f匹配失败  传统字符匹配是让i=3,j=0继续匹配,i++,j=0. 此种匹配方…
前言 此篇笔记根据自己的理解和练习心得来解释算法,只代表个人观点,如有不足请指出(我刚学QWQ) 浅谈字符串匹配 设想一个场景,假设你是一个净化网络语言环境的管理员,每天需要翻阅大量的文章和帖子来查找敏感字,那么这个时候很简单的可以想到可以运用字符串匹配来做到,但是朴素的单模式字符串匹配耗用时间多,那么在这里我们就可以运用高效率的\(KMP\)算法来解决. 算法对比 朴素单模式字符串匹配算法 朴素的单模式串匹配大概就是枚举每一个文本串元素,然后从这一位开始不断向后比较,每次比较失败之后都要从头开…
参考:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 2016-08-22 前言:自己看<算法导论>中关于KMP算法的讲解,文字描述+插图+伪代码,但最终还是云里雾里.之后借助于上面提到的博客才有所体会.感谢博主. 对于其最核心的部分---当模板字符串中前面q个字符和源字符串中的某个子串匹配时,如果继续往下匹配,发现两个字符并不相同,那该如何移动模板字符串进行比较呢…
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现.KMP算法的关键是利用匹配失败后的信息,从错误中吸取经验,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 代码:(tex为被查找的字符串,pat为要查找的模式串) scanf("%s", tex); scanf("%s", pat); n = strlen(tex); m = strlen(pat); pi[1] = 0; int p = 0; for…
KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历,如果有txt里面的i+j元素和pat里面的j元素不一致,调整.根据right[]调整,right[]类似与KMP算法里面的nextval.skip = j - right[txt.charat(i+j)]; if(skip < 1) skip = 1;  i+=skip; 即找txt里面的第i+j…
概述 提起字符串匹配可能更多人会想到KMP算法,该算法时间复杂度为O(m+n),而且也是我们在学习数据结构过程中最早接触到的比较好的算法.但KMP算法需要在模式字符串有关联的情况下,也即模式字符串前后缀字符相似度较高的情况下匹配效率比较高.但是在实际应用场景中模式字符串更多情况下是无规律的,因此在工程应用中字符串匹配问题的解决更多的使用的是sunday算法. 解题思路 sunday算法较之于BM算法最大的不同点在于sunday算法在匹配的过程中主串中参加匹配的最末位字符的下一位字符. 如果末尾的…
吐槽:前两天打组队赛遇到一个字符串的题考了这个(见:http://acm.hdu.edu.cn/showproblem.php?pid=5972 ) 当时写了个KMP瞎搞然后TLE了(害),赛后去查了许多资料似乎就看见一个题考了这么个鬼东西- 目录 问题给出 问题分析 另一种字符串匹配方法 朴素暴力 优化算法 核心代码 参考资料 问题给出 给一个主串\(S=s_1s_2...s_n\)和一个模式串\(T=(t_{11}|t_{12}|...|t_{1k_1})(t_{21}|t_{22}|...…