概述一说到字符串匹配算法,脑海里的第一映像,大部分是KMP算法,因为一般教科书里面都有,但是kmp算法对于我这种脑袋不怎么好用的,看完过一段时间就忘了。sunday同样是作为字符串匹配算法,比kmp,bm算法快,关键的关键是原理简单。
问题描述先说说sunday算法解决的问题吧:给两个字符串A,B,问字符串A的所有子串中有没有B
具体的例子来说,给你一篇文章,判断该文章里面有没有“我爱我的家”这句...
分类:
编程语言 时间:
2015-04-22 09:40:07
阅读次数:
200
题目描述暴力解法:枚举原串起始位置,逐个匹配,复杂度O(mn)。优化思路:失配时,前面已匹配的字符可以提供信息。KMP算法:对于模式串任意位置 i ,如果我们知道一个 k 使得 i 位置前的 k 个元素和模式串最开始的前 k 个元素一一相等,那么第 i 个元素失配时就可以之间从第 k + 1 个元素...
分类:
编程语言 时间:
2015-04-21 20:35:55
阅读次数:
100
前几天百度LBS部门实习二面,让写一个字符串匹配函数,当时忘记KMP怎么写了,就默默的写了一个暴力搜索,连尝试推导一下KMP都没有,结果自然是没有过,以后面试要多和面试官交流,就算忘记了,也要让他知道你试图推导,要不然他会觉得你可能都没有听过。 KMP是对前缀暴力搜索的改进,基于的想法其实是很...
分类:
编程语言 时间:
2015-04-21 14:24:25
阅读次数:
134
http://www.matrix67.com/blog/archives/115
Orz maxtix67
一直拖着到碰到了KMP算法的题才学。。
设有字符串A:abefgababef
模式串 B:abefgabef
当A与B进行匹配时,设i是A上的指针,j是B上的指针,则A和B匹配到第8位就会失配。按照常规方法,我们会将i跳回到2,j跳回到1进行匹配。观察之后我们会发...
分类:
编程语言 时间:
2015-04-21 11:21:20
阅读次数:
127
学习字符串匹配算法有一段时间了,不过还是有点迷糊,虽然了解算法过程,但是在编码的时候还是会有些迷糊。
先把写的程序放在这里,以后有时间再来翻着看看吧!
#include
#include
using namespace std;
int KMPfind(char* s, char* p);
void GetNext(char* p, int next[]);
int ViolentMatch(...
分类:
编程语言 时间:
2015-04-21 09:36:31
阅读次数:
150
题目大意:
给定一个字符串S,计算出所有可能的前缀-后缀字符串的长度。前缀-后缀字符串指的是S的
子串不仅是S的前缀,还是S的后缀。比如S = "alala",前缀-后缀字符有{"a","ala","alala"}。
思路:
KMP算法的应用。在KMP算法中,当字符串匹配失败时,模式串的指针并没有指向0从头比
较,而是指向了一个特定的位置,因为这个Next[j]指向的位置pos前长度为Next[pos]的子
串,同模式串第j位前的长度为Next[j]的子串是相同的。为了找到既能做前缀又能做后缀的子
串,纳...
分类:
其他好文 时间:
2015-04-21 09:34:38
阅读次数:
160
字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap。下面分析朴素搜索算法和KMP这两种方法并给出其实现。假设原字符T串长度N...
分类:
编程语言 时间:
2015-04-18 16:11:43
阅读次数:
246
@anthor : qingdujunKMP算法#include #include #define MAXSTRLEN 256typedef struct String{ char ch_string[MAXSTRLEN]; int len;}SString;/*保存Next值*/int...
分类:
编程语言 时间:
2015-04-18 13:04:41
阅读次数:
168
不敢去做一件事就会一直觉得它很难。。
以前一直觉得AC自动机应该超难写,学了以后发现实在太好写了。。
AC自动机的fail指针与KMP算法的next数组是极为相似的,都是通过这些来减少冗余的扫描,所以我也把AC自动机的fail指针名字直接开成next了。。
AC自动机与KMP的不同在于KMP是单模式串匹配,AC自动机是多模式串匹配,所以AC自动机可以理解为就是在trie树上加上一些next指...
分类:
其他好文 时间:
2015-04-18 10:05:17
阅读次数:
178
在简单的模式匹配时,每次遇到s[i]!=t[j] 时,每次都要讲i回溯。这往往浪费了很多时间。KMP算法就是当遇到s[i]!=t[j] 时,只让t[j] 回溯而s[i]不用回溯,这样就节省了很多时间。当t[1]t[2]…t[j-1]=s[i-j+1]s[2]…s[i-1]成立时,若t[j]!=s[i],则此时根据KMP算法只用回溯t[j].
假设有k( k< j)使t[1]t[2]…t[k-1]=...
分类:
编程语言 时间:
2015-04-18 08:51:37
阅读次数:
181