之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事。则 KMP 就是对朴素匹配的一种改进。正好复习一下。KMP 算法其改进思想在于:每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 i指针,而是利用已经得到的“部分匹配”的结果将模式子串向右“滑动”尽可能远的一段距离后,继续进行比较。如...
分类:
编程语言 时间:
2015-03-10 06:47:58
阅读次数:
9603
复习串的朴素模式匹配算法模式匹配 :子串定位运算,在主串中找出子串出现的位置。在串匹配中,将主串 S 称为目标(串),子串 T 称为模式(串)。如果在主串 S 中能够找到子串 T, 则称匹配成功,返回 第一个 和 子串 T 中 第一个字符 相等 的 字符 在主串S 中的 序号,否则,称匹配失败,返回...
分类:
编程语言 时间:
2015-03-09 09:18:26
阅读次数:
333
题目来源:URAL 1684. Jack's Last Word题意:输入a b 把b分成若干段 每一段都是a的前缀思路:b为主串然后用a匹配b 记录到b的i位置最大匹配的长度 然后切割 切割的时候要从后往前假设a = abac b = abab 那么假设从前往后 首先覆盖了aba 然后b就不能覆盖...
分类:
其他好文 时间:
2015-03-02 14:46:35
阅读次数:
135
一 简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。二 基于部分匹配表的KMP算法举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含搜索串...
分类:
编程语言 时间:
2015-03-01 19:48:12
阅读次数:
153
Manacher(马拉车)是一种求最长回文串的线性算法,复杂度O(n)。网上对其介绍的资料已经挺多了的,请善用搜索引擎。而扩展KMP说白了就是是求模式串和主串的每一个后缀的最长公共前缀【KMP更像是一个自动机】题目:POJ 1159:Palindrome求原字符串最少增加几个字符后可变成回文串,相当...
分类:
其他好文 时间:
2015-02-21 23:26:15
阅读次数:
242
一. KMP算法KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,简称KMP算法。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹...
分类:
编程语言 时间:
2015-02-10 12:45:59
阅读次数:
351
Rabin-Karp算法对于随机字符串匹配问题有良好的实用性。它建立在指纹思想上。
主串长度为n 模式串长度为m
假设
※①我们可以在O(m)时间计算一个P的指纹f(P)
※②如果f(P)不等于f(T[s..s+m-1]) 那么P一定不等于T[s..s+m-1]
※③我们可以在O(1)时间比较指纹
※④我们可以在O(1)的时间从f(T[s..s+m-1])计算f(T[s+1...
分类:
编程语言 时间:
2015-02-06 21:48:41
阅读次数:
283
Q:Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
这道题是让我们自己完善函数strStr():返回模式串needle在主串haystack中第一次出现的索引位置,若主串中不存在模式串...
分类:
其他好文 时间:
2015-02-05 11:25:23
阅读次数:
123
KMP算法简介
KMP算法全称叫做Knuth-Morris-Pratt Algorithm。
被搜索的字符串称为主串,待搜索的字符串称为模式串。
我们知道朴素模式匹配算法:http://blog.csdn.net/chfe007/article/details/43448655是很低效的,KMP算法从模式串出发,发现模式串中隐藏的信息来减少比较的次数,具体如何做到的可以移步这个链接:http...
分类:
编程语言 时间:
2015-02-03 17:26:28
阅读次数:
159
被搜索的字符串称为主串,待搜索的字符串称为模式串。朴素模式匹配算法的基本思想:
对主串的每一个字符作为子串开头,与模式串进行匹配。对主串做大循环,每个字符开头做模式串长度的小循环,直到匹配成功或全部遍历完成为止。
代码实现非常简单:
int strStr(char *haystack, char *needle) {
for (int i = 0;...
分类:
编程语言 时间:
2015-02-03 15:12:54
阅读次数:
224