KMP小结】的更多相关文章

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…
这篇小结主要是参考这篇帖子从头到尾彻底理解KMP,不得不佩服原作者,写的真是太详尽了,让博主产生了一种读学术论文的错觉.后来发现原作者是写书的,不由得更加敬佩了.博主不才,尝试着简化一些原帖子的内容,希望能更通俗易懂一些.博主的帖子一贯秉持通俗易懂的风格,使得非CS专业的人士也能读懂,至少博主自己是这么认为的-.-||| KMP算法,全称Knuth-Morris-Pratt算法,根据三个作者Donald Knuth.Vaughan Pratt.James H. Morris的姓氏的首字母拼接而成…
1. KMP模版: 代表题目:POJ 3641 Oulipo KMP http://blog.csdn.net/murmured/article/details/12871891 char P[MAXN],T[MAXM]; int f[MAXN],n,m,ans; void getFail() { f[0]=f[1]=0; int j; for(int i=1;i<n;i++) { j=f[i]; while(j && P[i]!=P[j]) j=f[j]; if(P[i]==P[j…
话说博主在写Max Chunks To Make Sorted II这篇帖子的解法四时,写到使用单调栈Monotone Stack的解法时,突然脑中触电一般,想起了之前曾经在此贴LeetCode All in One 题目讲解汇总(持续更新中...)的留言区中说要写单调栈的总结帖,当时答应了要写,就去LeetCode上看标记为Stack的题,可是发现有好多题,而且很多用的不是单调栈,于是博主一个一个的看了起来,但是无奈太多了,一直没有时间全部看完,就一直没有动笔写.虽说时间就像那啥,挤挤总会有的…
Given a non-empty string check if it can be constructed by taking a substring of it and appending multiple copies of the substring together. You may assume the given string consists of lowercase English letters only and its length will not exceed 100…
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation. For example: Given "aacecaaa", return "aaacecaaa&qu…
Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation. Example 1: Input: "aacecaaa" Output: "aaacecaaa&quo…
终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊(如果不方便注册博客园的话,可以下载下文提到的APP,在Feedback中给博主发邮件交流哈),同时也请大家踊跃地,大量地,盲目地提供各个题目的follow up一起讨论哈,多谢多谢,祝大家刷得愉快…
复杂度: O(len(a)+len(b)) 技巧及注意: 在匹配的时候记住先要自身匹配然后再匹配即可,同时边界问题不能忽略,处理好点吧. #include <cstdio> #include <cstring> using namespace std; const int N=10000; char a[N], b[N]; int p[N]; int main() { scanf("%s%s", a+1, b+1); int i, j, siza=strlen(…
KMP算法题型大致有两类,一类是next数组的应用,一类是匹配问题. next数组大多数是求字符串周期,或者是与前缀后缀有关,也可以应用在DP中.需要对next数组有一定理解才能做得出. next数组有一些性质.L为字符串长度. 如,L%(L-next[L])==0,说明字符串S[0,L-next[L]]是重复子串. 周期串/求循环节: HDU 1358  Period http://acm.hdu.edu.cn/showproblem.php?pid=1358 #include<iostrea…
最近看了一些关于KMP算法的资料,在此写一篇博客总计一下. 1.KMP算法介绍 KMP算法是一种字符串搜索的改进算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 举个例子: 有两个字符串,我们要在第一个字符串(主串)中寻找第二个字符串(模式串): bacbabababacaabababca 寻找的方法很简单,就是…
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串string a;这就需要根据具体场景来选择合适方便操作的方法.还有空串和空格串是不同的,空串字符长度为0(符号‘∅’),空格串包含一个或多个空格.这一章学习了两个串的模式匹配算法,特别是KMP算法,从中受益匪浅. 一.串 1.BF(Brute-Force)算法 这个模式匹配算法简单直观,被人们称为暴…
    KMP -- POJ3461解题报告 问题描述:给出字符串P和字符串T,问字符串P在字符串T中出现的次数 Sample Input 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN Sample Output 1 3 0 简单KMP应用, 代码如下: //poj3461解题报告 #include<iostream> using namespace std; ], P[]; int len1, len2; ]; void getnext(char…
KMP 简要说明 \(kmp\)是一个非常神奇的东西.它的\(fail(next)\)数组\(f[i]\)就表示\(1\)~\(i\)这个串的最长公共前缀后缀长度.根据这个\(fail\)数组,在匹配的时候就可以加快当前匹配位置的转移,省去一些不必要的比较. 题目 剪花布条 题意:给两个字符串\(s\),\(t\),问将\(s\)按照适当的方式切割后,最多能得到几个串\(t\)? 这里考虑不使用\(hash\)的做法. 在字符串\(s\)中找\(t\),用\(kmp\)即可.需要注意的是前后两次…
kmp算法的时间复杂度是O(m+n) 主要作用: 1.最长公共前后缀问题 2.原串中含有几个模式串问题 3.循环节问题…
首先请允许我对KMP算法的三位创始人Knuth,Morris,Pratt致敬,这三位优秀的算法科学家发明的这种匹配模式可以大大避免重复遍历的情况,从而使得字符串的匹配的速度更快,效率更高. 首先引入对kmp算法的引例: 如果按照暴力算法来看,这6步一步也少不了,是很麻烦的: 但是对于要匹配的子串来讲,子串T的首字母与后面的任何一个字母都不想等,拿图1来看首字母'a'与主串S的第2位到第5位的任意一个字母都是不相通的 换言之:图2345的步骤都是多余的 如果知道T子串的首字符'a'与T以后的字符均…
跪拜_Blackjack_神犇…
http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.html 如果有哪一天不记得模板了就去看看大神的 .  非常清晰易懂.…
转载http://blog.csdn.net/yutianzuijin/article/details/11954939 kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚.在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚. kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的…
浅析KMP算法 KMP算法是一种线性字符串的匹配算法,将主串S与模式串T匹配. 首先朴素算法大家都会,就是直接从S的每一个位置开始,枚举比较,时间效率为O(nm),现在要想到一种化简的方式,使得时间复杂度得以减少,不考虑其他古怪的时间复杂度,那么必然要求是线性的. 观察串S="aaaaab",T="aaab",现在进行朴素的算法,看看有什么可化简的地方. 观察S匹配到第3位,T匹配到第3位的时候,发现下一位不能再匹配,此时说明S[1..3]=T[1..3],所以S[…
首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-id-3280128.html两篇博文的作者,参考这两篇博文才对KMP算法有了初步认识,本文的一些内容也是来自于这两篇之中.KMP算法与BF算法的优略.回溯不回溯这些问题本文不作说明,而主要说明next函数(通常保存为一个next数组)的意义.这正是KMP算法难于理解的地方. 为了方便起见,在不会起歧…
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP算算法 §5 KR算法 §6 AC自动机 §7 小结 §1 Boyer-Moore(BM)算法 Boyer-Moore算法原理 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到…
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP算算法 §5 KR算法 §6 AC自动机 §7 小结 §1 Boyer-Moore(BM)算法 Boyer-Moore算法原理 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到左开始比较,但模式串的移动还是从左到右的.字符串匹配的关键就是模式串的如何移动才…
kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚.在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚. kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm).kmp算法通过一个O(…
模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串,s2均为模式串: 一般地,文本串长度不小于匹配串:(否则无意义) 很显然可以得到一个暴力的做法 : ~lenth_of_s1 {//枚举匹配串在文本串中的开始位置 ~lenth_of_s2 ]) break; if j>lenth_of_s2 //在循环结束前没有break output : i }…
[小结] 中山纪念中学2018暑期训练小结(划掉)(颓废记)-Day10 各位看众朋友们,你们好,今天是2018年08月14日,星期二,农历七月初四,欢迎阅看今天的颓废联编节目 最近发生的灵异事件有 1.本人模拟赛直接打出T2目测全场唯一AC代码结果细节被O2直接卡掉 2.第16号台风在附近海区逗留3天成功画出一个D-og 3.卖文具的小卖店提前装修结束开业 4.考场上明知道能用生成树做的题目还要用二分做,结果全部T掉 5.去食堂路上开始下雨,到食堂之后雨停了.... 好不水了,说点正经的 最近…
感悟:预处理next[ ]数组求解B串的"自我匹配过程",思路与KMP类似,目标得到最大相同的前缀.后缀. ([1->k]==[i-k+1,i]),可以根据由前往后,利用前面已知递推得到后面未知next[ ]. KMP,利用B串自身的next[ ](最大相同前缀,后缀)数组,当发生不匹配位置时快速实现B串指针位置的精确滑动,从而加快串的匹配效率. kmp算法是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博…
题意:有两个字符串\(a,b\),下标从\(0\)开始.求数对\((i,j)\)满足\(a[i+1:j] + r(a[j:n]) + r(a[0:i+1]) = b\),其中\(r(s)\)表示字符串\(s\)的反串.若有多组解,输出其中\(i\)最大,然后\(j\)尽可能小的一组. \(|a|,|b| \leq 10^6\) 首先考虑枚举\(i\).那么,我们就要让\(a[i+1:j] + r(a[j:n]) = b[0:n-i-1]\).因此,前面的\(a[i+1:j]\)必须是\(b\)的…
思考: replace图解: 程序完善: DTString.h: #ifndef DTSTRING_H #define DTSTRING_H #include "Object.h" namespace DTLib { class String : Object { protected: char* m_str; int m_length; void init(const char* s); bool equal(const char* l, const char* r, int len…
问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹配表呢? 前缀集合和后缀集合取最长的交集就是部分匹配值. 例如,上图中前缀和后缀没有交集,部分匹配值就是0. 问题: 怎么编程产生部分匹配表呢? 从第2个字符开始递推,做一个贪心的假设,我们现在要求的匹配值是由上一次得到的匹配值加1得到. 假设有5个字符,当前的匹配值是3,当有6个字符时,我们就假设…