不敢去做一件事就会一直觉得它很难。。
以前一直觉得AC自动机应该超难写,学了以后发现实在太好写了。。
AC自动机的fail指针与KMP算法的next数组是极为相似的,都是通过这些来减少冗余的扫描,所以我也把AC自动机的fail指针名字直接开成next了。。
AC自动机与KMP的不同在于KMP是单模式串匹配,AC自动机是多模式串匹配,所以AC自动机可以理解为就是在trie树上加上一些next指...
分类:
其他好文 时间:
2015-04-18 10:05:17
阅读次数:
178
所有字符串匹配算法的核心问题是,当出现不匹配时,如何向后移动模式串一、暴力匹配算法 如果要匹配一个字符串s 和一个模式串p,则从i=0开始依次匹配s[i:(i+len(p))],简单粗暴,代码如下:def matcher(t, p): # param t: the string to chec...
分类:
编程语言 时间:
2015-04-13 22:48:09
阅读次数:
154
算法核心,Next数组(模式串的最长前缀后缀表)。KMP的思想就是,当匹配不正确时,模式串向后移动的距离为:已匹配的字符串个数 - next[j]而Next数组的算法起始也是递归的字符串匹配过程。Impl: 1 //Next数组计算 2 void CalNext(const char* p, int...
分类:
其他好文 时间:
2015-04-10 10:55:45
阅读次数:
126
在KMP算法中,最关键的就是求解next数组了。那么如何快速求解next数组呢?
已知模式串:A B
C D A
B D
D A
其next数组:0 0
0 0 1
2 0
0 1
那么是如何求证出来的呢?
首先字符串从左至右遍历。
第一个字符A的next数组对应元素为0,
第一个字符A和第2个字符B比,不相等。B:0(表示字符B的next数组对应元素为0);
第...
分类:
编程语言 时间:
2015-04-07 19:43:19
阅读次数:
178
就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++;还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次出现的位置。如果repr[i] == i,说明这个模式串之前没有重复过,可以加进自动机里去。有重复的话...
分类:
其他好文 时间:
2015-04-05 21:44:27
阅读次数:
127
AC自动机大名叫Aho-Corasick Automata,不知道的还以为是能自动AC的呢,虽然它确实能帮你AC一些题目。=_=||AC自动机看了好几天了,作用就是多个模式串在文本串上的匹配。因为有多个模式串构成了一颗Tire树,不能像以前一样线性递推失配函数f了,于是改成了BFS求失配函数。白书上...
分类:
其他好文 时间:
2015-04-04 22:20:49
阅读次数:
307
BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快。时间复杂度O(m/n)C++描述(教师版)int BM(char S[],char T[], int n, int m){//主串长度为n,模式串长度为m,主串和模式...
分类:
编程语言 时间:
2015-04-01 19:31:34
阅读次数:
158
字符串查找算法在于其效率的高低,单个字符的一次比较从头到尾遍历一遍肯定能找出来,但这样效率太低。比较著名的算法有KMP和BM(KMP看着烦躁),但个人来说,Sunday算法是我最能理解且效率不错的算法(而且代码很简单啊)。sunday算法关注的是模式串的下一个字符的匹配情况(因为字符串不匹配的话,模...
分类:
其他好文 时间:
2015-03-31 17:29:36
阅读次数:
180
问题描述:给定字符串s与模式串p,其p中‘.‘可以匹配s中任意字符,‘*‘可以匹配0个或者任意多个之前字符,判断模式串p是否匹配全部字符串s(不是部分)。例子:isMatch("aa","a")→falseisMatch("aa","aa")→trueisMatch("aaa","aa")→falseisMatch("aa","a*")→trueisMatch("aa"..
分类:
其他好文 时间:
2015-03-31 01:03:53
阅读次数:
120
问题描述:给定字符串s与模式串p,其中p中的‘?‘可以匹配任意单个字符,‘*‘可以匹配任意字符串(包括空串),判断模式串是否匹配字符s全部(不是部分)。例子:isMatch("aa","a")→falseisMatch("aa","aa")→trueisMatch("aaa","aa")→falseisMatch("aa","*")→trueisMatch("aa"..
分类:
其他好文 时间:
2015-03-31 01:03:35
阅读次数:
115