数据结构——KMP(串)】的更多相关文章

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…
数据结构—KMP KMP算法用于解决两个字符串匹配的问题,但更多的时候用到的是next数组的含义,用到next数组的时候,大多是题目跟前后缀有关的 . 首先介绍KMP算法:(假定next数组已经学会,后边next数组会在介绍) 上图T为主链,P为模板链,要求P在T中是否出现,出现就返回位置. 朴素算法会顺序遍历,比较第一次的时候p[0]处失配,然后向后移动继续匹配.数据量大的时候这么做肯定是不可行的.所以这里就会有KMP算法!在一次失配之后,KMP算法认为这里已经失配了,就不能在比较一遍了,而是…
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 i 和 j 位置上的字母相同时,两个指针都指向下一个位置继续比较: (2)当 i 和 j 位置上的字母不同时,i 退回上次匹配首位的下一位,j 则返回子串的首位. (注:该图从下标为1开始 ) 实现程序: /** * 朴素的模式匹配算法 * 说明:下标从0开始,与书稍有不同,但原理一样 * @author…
KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的最后也讨论这个算法的局限性. 一般的匹配算法: KMP基本概念引入: 但是,其实我们会发现,上面的中间两个匹配步骤是没有必要的,因为他们的第一个匹配字母就不相同,完全没有可比性,而当我们在第四次匹配的时候,其实我们从模式串中就可得知,只有当模式串滑到这个地方的时候,它的匹配才是最有价值的,因为从模式…
#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<algorithm> #include<queue> using namespace std; void getnext(char *t, int *next, int lent) { int i = 0, j = -1; next[0] = -1; while (i <…
--喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 一道题目3.KMP模式匹配算法改进 4.朴素算法和KMP算法的时间复杂度分析 5.KMP算法next[]数组理解附: 正文 字符串匹配 给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置. 如下面两个字符串: string s = "bacbababadababa…
KMP一个非常经典的字符串模式匹配算法,虽然网上有很多kmp算法的博客,但是为了更好的理解kmp我还是自己写了一遍(这个kmp的字符串存储是基于堆的(heap),和老师说的定长存储略有不同,字符串索引从0开始) 先来说说 KMP 的历史吧. 一.背景 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速…
串(string)(或字符串)是由零个或多个字符组成的有限序列.串中字符的数目称为串的长度.零个字符的串称为空串(null string),它的长度为零. 串中任意个连续的字符组成的子序列称为该串的子串.包含子串的串相应地称为主串.通常称字符在序列中的序号为该字符在串中的位置.子串在主串中的位置则以子串的第一个字符在主串中的位置来表示. 只有当两个串的长度相等,并且各个对应位置的字符都相等时才相等. 串有3种机内表示方法: * 1.定长顺序存储表示 * 2.堆分配存储表示 * 3.串的块链存储表…
翻译计划     小明初学者C++,它确定了四个算术.关系运算符.逻辑运算.颂值操作.输入输出.使用简单的选择和循环结构.但他的英语不是很好,记住太多的保留字,他利用汉语拼音的保留字,小屋C++,发明了一种表达自己思想的算法描写叙述规则.     规则非常easy:他将開始程序头部以一个拼音名字标记,C++程序中的"{,}"用拼音"kaishi,jieshu"直观表示.选择和循环仅仅採用一种单一的结构,且保留字也分别用相应的拼音表示,只是在表示选择或循环条件时他去掉…
串(string)是n(n>=0)个字符组成的有限序列. 由于串中的字符都是连续存储的,在C#中有恒定不变的特性.一经创建就保持不变. 为了区别C#中的string,因此以stringDS类模拟string的数据结构,代码如下: class stringDS { private char[] _data; //字符数组 //索引器 public char this[int index] { get { return _data[index]; } set { _data[index] = val…
感悟:预处理next[ ]数组求解B串的"自我匹配过程",思路与KMP类似,目标得到最大相同的前缀.后缀. ([1->k]==[i-k+1,i]),可以根据由前往后,利用前面已知递推得到后面未知next[ ]. KMP,利用B串自身的next[ ](最大相同前缀,后缀)数组,当发生不匹配位置时快速实现B串指针位置的精确滑动,从而加快串的匹配效率. kmp算法是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博…
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not Found”. 本题旨在测试各种不同的匹配算法在各种数据情况下的表现.各组测试数据特点如下: 数据0:小规模字符串,测试基本正确性: 数据1:随机数据,String 长度为 1,Pattern 长度为 1: 数据2:随机数据,String 长度为 1,Pattern 长度为 1: 数据3:随机数据,…
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not Found”. 本题旨在测试各种不同的匹配算法在各种数据情况下的表现.各组测试数据特点如下: 数据0:小规模字符串,测试基本正确性: 数据1:随机数据,String 长度为 1,Pattern 长度为 1: 数据2:随机数据,String 长度为 1,Pattern 长度为 1: 数据3:随机数据,…
算法介绍 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法).KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息.KMP算法的时间复杂度O(m+n). next数组 我们记主串为字符串S,模式串为字符串P. 我们用next[j]表示以字符Pj结尾的子串的长度相等的前…
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not Found”. 本题旨在测试各种不同的匹配算法在各种数据情况下的表现.各组测试数据特点如下: 数据0:小规模字符串,测试基本正确性: 数据1:随机数据,String 长度为 1,Pattern 长度为 1: 数据2:随机数据,String 长度为 1,Pattern 长度为 1: 数据3:随机数据,…
总结一下今天的收获(以王道数据结构书上的为例子,虽然我没看它上面的...):其中竖着的一列值是模式串前缀和后缀最长公共前缀. 最后求得的结果符合书上的结果,如果是以-1开头的话就不需要再加1,如果是以0开头就需要每个元素加1. 以上的解题思路参照的是:“正月点灯笼”大佬.…
定义 改进字符串的匹配算法 关键:通过实现一个包含了模式串的局部匹配信息的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值 否则,后缀行向右…
KMP小结   By Wine93 2013.9 1.学习链接: http://www.matrix67.com/blog/archives/115 2.个人小结 1.KMP在字符串中匹配中起着巨大作用,可以在O(n+m)内完成 2.要充分理解next 数组,其求法和next数组的含义(最长后缀等于最长前缀),了解其用途,下面我就next数组在求字符串最小周期中的应用举例 (1).什么是字符串最小周期? Ex:字符串ababab,最小周期为2,为ab Ex:字符串abcd,最小周期为4,为abc…
堆分配存储表示 这种存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得. 结构图: 实现: function HString(){ this.ch = {}; this.length = 0; } exports.HString = HString; HString.prototype = { // 1 <= position <= this.length.在串的第position个字符之前插入串tHString strInsert:…
今天照着课本敲了一下KMP.. 以OJ上的一个题为例敲了一下.. 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2125 #include <iostream> #include <cstdio> #include <cstring> using namespace std; ],len_s,len_t; ],t[]; void get_nextv() { ,j…
KMP算法 KMP算法是字符串匹配算法,可以在O(n)的时间完成,算法包含两部分,分别是:构造适配函数与两串匹配. 失配边的使用大大提高了算法效率,可以理解为已经成功匹配的字符不在重新匹配,因为我们已经知道它是什么,对应到算法中 匹配失败后应该在最大前缀之后继续匹配,因为某后缀已与最大前缀匹配成功而不用重新比较. 以下为代码实现: + ; void getFail(char* P,int* f){ //构造失配边 int n=strlen(P); f[]=f[]=; ;i<n;i++){ //自…
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…
函数题: 6-1 查找子串: 裁判测试程序样例: #include <stdio.h> #define MAXS 30 char *search(char *s, char *t); void ReadString( char s[] ); /* 裁判提供,细节不表 */ int main() { char s[MAXS], t[MAXS], *pos; ReadString(s); ReadString(t); pos = search(s, t); if ( pos != NULL ) p…
初学KMP的时候,一直不得要领.后来学习AC自动机的时候,一下子明白了KMP实际上是AC自动机的特殊情况. 首先贴三段代码,一组是回溯法,暴力求解,另外两个是KMP串模式匹配 /* 回溯法字符串匹配算法就是用一个循环来找出所有有效位移, 该循环对n-m+1个可能的位移中的每一个index值,检查条件为P[0-m-1]= S[index-index+m-1] (因为模式串的长度是m,索引范围为0-m-1).该算法思维比较简单(但也常被一些公司做为面试题), 很容易分析出本算法的时间复杂度为O(pa…
//KMP串的模式匹配算法 #include <stdio.h> #include <stdlib.h> #include <string.h> int* get_next(char t[], int length) { , j = -; int* next = (int *)malloc(length * sizeof(int)); next[] = -; while (i < length) { || t[i] == t[j]) { i++; j++; nex…
---恢复内容开始--- 在看数据结构的串的讲解的时候,讲到了KMP算法——一个经典的字符串匹配的算法,具体背景自行百度之,是一个很牛的图灵奖得主和他的学生提出的. 一开始看算法的时候很困惑,但是算法思想很简单,就是在暴力匹配的基础上得出的. 暴力匹配 这里有必要说一下暴力匹配,暴力匹配更简单,就是按照人的常规思维去匹配字符串,拿模式串(P)的第一个字符去和给定串(S)比较,S从左往右看,一看,第一个,呀~不对,啥也不说了,第一个都不对了,后边还比个毛.所以,这一次比较,S中第一个字符开头是匹配…
前些日子写了一篇KMP算法的博文,浅谈数据结构之KMP(串中的模式匹配算法),在这片文章中,谈到了一个模式串K值的记录数组 next[],详细可看那篇文章,其实,前面定义的next[]数组是有一定缺陷的,下面我面我将针对一种情况进行举例: 如上图,如果按照之前的方法所获取的next[]数组的话,当两个字符串匹配到上图的情况是,将会出现如下图的情况: 我们发现,从step1到step3所走的路都是浪费的,因为都是用同一个字母(a)和b去比,而这个计算机也是哼容易识别的,所以对于 next[]的改进…
前些日子写了一篇KMP算法的博文,浅谈数据结构之KMP(串中的模式匹配算法),在这片文章中,谈到了一个模式串K值的记录数组 next[],详细可看那篇文章,其实,前面定义的next[]数组是有一定缺陷的,下面我面我将针对一种情况进行举例: 如上图,如果按照之前的方法所获取的next[]数组的话,当两个字符串匹配到上图的情况是,将会出现如下图的情况: 我们发现,从step1到step3所走的路都是浪费的,因为都是用同一个字母(a)和b去比,而这个计算机也是哼容易识别的,所以对于 next[]的改进…
初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford…