<数据结构>KMP算法】的更多相关文章

数据结构—KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会,后边next数组会在介绍) 上图T为主链,P为模板链,要求P在T中是否出现,出现就返回位置. 朴素算法会顺序遍历,比较第一次的时候p[0]处失配,然后向后移动继续匹配.数据量大的时候这么做肯定是不可行的.所以这里就会有KMP算法!在一次失配之后,KMP算法认为这里已经失配了,就不能在比较一遍了,而是…
翻译计划     小明初学者C++,它确定了四个算术.关系运算符.逻辑运算.颂值操作.输入输出.使用简单的选择和循环结构.但他的英语不是很好,记住太多的保留字,他利用汉语拼音的保留字,小屋C++,发明了一种表达自己思想的算法描写叙述规则.     规则非常easy:他将開始程序头部以一个拼音名字标记,C++程序中的"{,}"用拼音"kaishi,jieshu"直观表示.选择和循环仅仅採用一种单一的结构,且保留字也分别用相应的拼音表示,只是在表示选择或循环条件时他去掉…
算法介绍 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息.KMP算法的时间复杂度O(m+n). next数组 我们记主串为字符串S,模式串为字符串P. 我们用next[j]表示以字符Pj结尾的子串的长度相等的前…
定义 改进字符串的匹配算法 关键:通过实现一个包含了模式串的局部匹配信息的next()函数,利用匹配失败的信息,减少匹配次数. 1.BF算法 暴力匹配 给定 文本串S "BBC ABCDAB ABCDABCDABDE" 存储为 s[i]   和模式串 P "ABCDABD"   存储为p[j] 进行匹配 思路 p串与S串逐一匹配 ,不匹配则 p串右移一位,匹配下一个 . p串不断右移 直到第四位匹配成功 不断向后匹配 直到失败 i,j回退到p串在s串的初始位置,p串…
next数组 定义 严格定义:next[i]表示使子串s[0...k] == s[i-k...i]的最大的k(前后缀可以重叠,但不能是s[0..i]本身) 含义:最长相等前后缀的下标,没有则赋-1 图形化解释:s[0]开始找到一个最长子串,满足一个条件:把该子串拉到末尾时能与母串的完全重合 求解 递归 上述判断可以归纳为一个递归过程: 读取两行子串,一行提供前缀,一行提供后缀. 读取新字符s[i]时,后缀行不断向左滑动. 如果能匹配,则根据后缀行最后一个匹配元素下标即next值 否则,后缀行向右…
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html /*#include<iostream> #include <string> using namespace std; int count_same_char(string T,int j); void get_next(string T,int *next) { int j=1; next[1]=0; f…
总结一下今天的收获(以王道数据结构书上的为例子,虽然我没看它上面的...):其中竖着的一列值是模式串前缀和后缀最长公共前缀. 最后求得的结果符合书上的结果,如果是以-1开头的话就不需要再加1,如果是以0开头就需要每个元素加1. 以上的解题思路参照的是:“正月点灯笼”大佬.…
  数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字符起和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从串s 的第二个字符起再重新和串t进行比较. 2) 依此类推,直至串t 中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的第一个字符在串s 中的位置就是t 在s中的位置,否则模式匹配不成功. Brute…
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发现了该算法效率并不高.当失配位置之前已经有若干字符匹配时,暴力法很多步骤是多余的.举个KMP算法的例子,看图1 可以看到子串p和主串t在红框处失配了,失配之前的字符串ABC已经匹配.ABA第一个字符A和后面的字符都不同,所以可以放心地直接将子串p的p[0]对齐失配处i,让p[0]和t[i]接着比较.…
我还是不太懂... 转2篇大神的解释    1>https://www.cnblogs.com/yjiyjige/p/3263858.html     2>https://blog.csdn.net/starstar1992/article/details/54913261/ 以后详细补上 算法: void cal_next(char *str, int *next, int len) { next[] = -;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀 ;//k初…
题目: 7-1 串的模式匹配 (30 分) 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行: 第一行是主串S: 第二行是模式T. 输出格式: 输出相匹配的子串中的第一个字符在主串S中出现的位置.若匹配失败,输出0. 输入样例: 在这里给出一组输入.例如: aaaaaba ba 输出样例: 在这里给出相应的输出.例如: 6 分析: 这里就是在主串里面找是否存在…
数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvawl/p/9768729.html,但是不同点在于之前的KPM中next数组存放的是到了该位时最大前后缀长度,而这里的KMP中next数组存放的是j下一步需要移动的位置. 个人觉得课本上的KMP算法强调位置,模式串上指针位置j,主串指针位置i,对于位置上的变化,更利于理解代码. 先贴出代码: #inc…
Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3797    Accepted Submission(s): 1776 Problem Description It is well known that AekdyCoin is good at string problems as well as nu…
在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还给了我们一道作业题去巩固: 这道题如下: 7-1 串的模式匹配 (30 分)   给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行: 第一行是主串S: 第二行是模…
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法数据结构专题的第29篇文章,我们来聊一个新的字符串匹配算法--KMP. KMP这个名字不是视频播放器,更不是看毛片,它其实是由Knuth.Morris.Pratt这三个大牛名字的合称.老外很喜欢用人名来命名算法或者是定理,数学里就有一堆,什么高斯定理.欧拉函数什么的.但是中国人更倾向于从表意上来给一个概念命名,比如勾股定理.同余定理等等.之前觉得用人名命名很洋气,作者可以青史留名,后来想想这也是英文表意能力不足,很难用表意的方…
目录 前言 串的定义 串的比较 串的抽象类型数据 串与线性表的比较 串的数据 串的存储结构 串的顺序存储结构 串的链式存储结构 朴素的模式匹配算法 模式匹配的定义 朴素的匹配方法(BRUTE FORCE 算法,BF 算法) 时间复杂度分析 KMP 模式匹配算法 KMP 与 BF 算法 KMP 算法原理 模式串向右移动距离的计算 基于 next 的 KMP 算法的实现 KMP 时间复杂度 参考代码 串 & KPM 算法 前言 李柱明博客:https://www.cnblogs.com/lizhum…
KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上蛋疼的KMP是讲解很多,基本都是走的高大上路线看的你也是一头雾水,我试图用自己的理解用最接地气的方式描述 KMP KMP也是一种优化版的…
我们要找到一个短字符串(模式串)在另一个长字符串(原始串)中的起始位置,也就是模式匹配,最关键的是找到next数组.最简单的算法就是用双层循环来解决,但是这种算法效率低,kmp算法是针对模式串自身的特点,当失配时,能够利用next数组得到的信息直接跳过不可能匹配成功的位置字符.例如模式字符串“ababaaaba”,假设当匹配到第6个字符“a”发生错误,传统方法是原始字符串往后移动一个,但是原始串显然第2个字符是b(因为之前匹配过了),不可能是模式串的起始字符,而next会发现从原始串的第1个字符…
直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub) { int j = 1, k = 0; int[] next = new int[sub.length()]; next[0] = -1; // 这个是规定 next[1] = 0; // 这个也是规定 // while (j < sub.length() - 1) { if (sub.char…
本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯指针,而是利用已经得到的"部分匹配"结果将模式向右"滑动"尽可能远的一段距离,继续进行比较.显然我们首先需要获取一个"部分匹配"的结果,该结果怎么计算呢? 二.算法分析 在上一篇中讲到了BF算法,…
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstring> using namespace std; //-----串的定长顺序存储结构----- #define MAXLEN 255 //串的最大长度 typedef struct { ]; //存储串的一维数组 int length; //串的当前长度 }SString; ]; ]; int Inde…
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 package com.alice.dataStructe5.bf; /** * 返回子串t在主串s中第pos个字符之后的位置,若不存在,则返回-1 * @author Administrator * */ public class BF { public int index(String s,St…
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言…
KMP算法用于模式串字符匹配,因为没有提前预习,上课时听得云里雾里,后来回去看了一晚上,翻了一些网上的讲解才理解了.我简单讲一下,我们在一串字符串A里搜索匹配另一段字符串B时,思路最简单方法的就是从第一位开始一个个对照匹配,出现错误就移动到第二个字符继续匹配,不匹配再第三个.但这样毕竟性能比较低,KMP引入了一个next数组,先将需要匹配的这段字符B计算出next值,在AB匹配的时候如果出现不匹配的情况,就根据next值跳到对应的字符继续匹配,所以中间就省略了一些不必要的匹配,从而提高了性能.n…
五.KMP算法:    *KMP算法是一种改进的字符串匹配算法.    *KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.    例如:在BBC ABCDAB ABCDABCDABDE中找到ABCDABD    KMP算法的想法是,利用已经知道的前面六个字符"ABCDAB",不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率. …
举例来说,有一个字符串"DSFFKFJD KFJLKFDLJFJ IWWJKJFJIA",我想知道,里面是否包含另一个字符串"JFJI",有的话就返回在原字符串中的下标 先看看Java编码的实现 public static void main(String[] args) { String source = "DSFFKFJD KFJLKFDLJFJ IWWJKJFJIA"; String des = "JFJI"; for…
  给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行: 第一行是主串S: 第二行是模式T. 输出格式: 输出相匹配的子串中的第一个字符在主串S中出现的位置.若匹配失败,输出0. 输入样例: 在这里给出一组输入.例如: aaaaaba ba 输出样例: 在这里给出相应的输出.例如: 6 解题思路:串的模式匹配有两种:一种是BF算法,一种是KMP算法:基于这道题给…
通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置.一次次的循环,直到匹配成功或者程序结束. "KMP"算法相比于"BF"算法,优势在于: 在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离: 并且可以在O(n+m)的时间数量级上完成对串的模式匹配操作: 故,"…
next数组表示字符串前后缀匹配的最大长度.是KMP算法的精髓所在.可以起到决定模式字符串右移多少长度以达到跳跃式匹配的高效模式. 以下是对next数组的解释: 如何求next数组: 相关链接:按顺序阅读为宜 详解KMP算法:https://www.cnblogs.com/yjiyjige/p/3263858.html       //我觉得算法部分,这篇讲得最好,优先看,例子很具体 字符串匹配KMP算法:https://kb.cnblogs.com/page/176818/         …
1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 在实现返回位序号从begin到end-1的子串时,注意,此处串的起始位置为0,同时为了方便,我们再次没有新建一个变量,而是返回一个string,可以直接输出,在main函数中可以看到. 通过string.indexof()函数将字符数组转化为字符串. 同时在实现每个字符串的操作之前,先进行异常处理,…