KMP算法(查找子序列)】的更多相关文章

回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false:这种方法简单粗暴,但思路清晰.又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法. KMP算法:先对要查找的字符串进行分析,找出其中重复的子字符串.然后将目标串与源串比较,一旦比较失败,则不用回朔,而是根据目标串子串的…
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发现了该算法效率并不高.当失配位置之前已经有若干字符匹配时,暴力法很多步骤是多余的.举个KMP算法的例子,看图1 可以看到子串p和主串t在红框处失配了,失配之前的字符串ABC已经匹配.ABA第一个字符A和后面的字符都不同,所以可以放心地直接将子串p的p[0]对齐失配处i,让p[0]和t[i]接着比较.…
假设长字符串为t,短字符串为p.为了进行KMP匹配,首先需要计算字符串p的next数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next).对于”abcabcab”,计算出的next数组如下图: 其中:next[i]给出如下信息:从左到右将p的字符与t的字符进行比对时,若在p的i号位置出现不匹配,就将字符串p相对t右移i-next[i]位:若next[i]>=0,则右移后比对位置从next[i]号位置开始,否则从0号位置开始.下图给出了一个匹配示例.…
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言,…
题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距离,再调用函数判断T接下来的序列中是否存在W. 如果不能匹配,则终止. 结果,这样超时了...估计是调用函数上面花费了些时间. 后来直接在函数中记录出现的个数,这样就不超时了. #include <iostream> #include <stdio.h> #include <st…
文档下载页面http://download.csdn.net/detail/yedeqixian/4209500      80页在讲KMP算法的开始先举了个例子,让我们对KMP的基本思想有了最初的认识.目的在于指出“由此,在整个匹配的过程中,i指针没有回溯,”.我们继续往下看:现在讨论一般情况.假设 主串:s: ‘s(1)  s(2)  s(3) ……s(n)’ ;   模式串 :p: ‘p(1)  p(2)  p(3)…..p(m)’ 把课本上的这一段看完后,继续现在我们假设 主串第i个字符…
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/37832707 作者:小马 在一个长串中查找一个子串是较经常使用的操作.各种信息检索系统,文字处理系统都少不了.本文介绍一个很著名的KMP模式匹配算法用于子串查找. 先抛开KMP.正常情况一下我们会怎样设计这个逻辑.一个主串S, 要在里面查找一个子串T,假设找到了返回T在S中開始的位置,否则返回-1.应该不难.须要一个辅助函数,从一个串口的指定位置.取出指定长度的子串.思想是这样:…
串这个概念对于我们学到现在的水平来说应该是经历颇丰了,因为在C语言中我们所用到的"串"知识是在字符串那里,有了这个概念,我们再去学习串就相对而言轻松多了. 那么,现在来介绍一下字符串的基本知识点吧: 首先,所谓的串: 1.都由ASCII码组成: 2.长度基本没有要求 串的表示方式: 1.顺序存储结构--数组 2.非线性存储结构--链表 那么,我们在C语言中对于串的处理,一般无非是以下几种: 1.初始化"串": 2.销毁"串": 3.获取"…
KMP类似暴力,但是不会和暴力完全一样,回溯到起点. 简单的说  假如   模板链字符串是:        abcabcabcabd        寻找abcabd 在模板链出现的次数,并且输出该次数. 完全暴力过程: 假设  a[]为模板链,b[]为要查找的子序列. 先取b[]的首一直对应,然后a[],b[]同时移动,当a[],b[]不匹配的时候,b[]回到起点,a[]向后移动单位1.              这点很容易想到,我写出来是为了方便和后面的KMP算法作比较. KMP过程: 假设仍…
查找字符串是我们平常编程过程中经常遇到的,现在介绍一种查找字符串算法,增加程序的执行速度. 通常我们是这么写的: /* content: search a string in a othor string author: lw date: 2015-01-30 target: kmp algorithm */ #include <stdio.h> #include <string.h> void compare(char * sourcestr, char * targetstr)…