原创地址:https://blog.csdn.net/fjssharpsword/article/details/53465266
这里实现了基于有限自动机(Finite Automaton,FA)的模式匹配算法,算法的重点在于利用字符串的前后缀构造模式P的自动机,具体结合导论中的说明来理解,可参考http://www.geeksforgeeks.org/searching-for-patterns-set-5-finite-automata/理解,参考代码如下:
-
package cn.ansj;
-
-
public class AtuomatonMatcher {
-
final public static int NO_OF_CHARS=256;//假设字母表有256个字符
-
-
//对于状态k和给定的字符x,返回下一个状态。M为pat的长度
-
public static int getNextState(char[] pat, int M, int k, int x){
-
// 因为:pat[0...k-1]x 和 pat 的前面都是是一样的,如果x == pat[k]可直接返回。
-
if (k < M && x == pat[k])
-
return k+1;
-
-
int ns, i; // ns 是下一个状态
-
// ns 最终是最长的那个 prefix (同时也是pat[0..k-1]x)的后缀
-
//从可能得最长的前缀位置开始,找到后break,即为所求
-
for (ns = k; ns > 0; ns--) {
-
if(pat[ns-1] == x){
-
for(i = 0; i < ns-1; i++) {
-
if (pat[i] != pat[k-ns+1+i])
-
break;
-
}
-
if (i == ns-1)
-
return ns;
-
}
-
}
-
return 0;
-
}
-
-
/* 构建FA */
-
public static void computeTF(char[] pat, int M, int[][] TF){
-
int state, x;
-
for (state = 0; state <= M; ++state)
-
for (x = 0; x < NO_OF_CHARS; ++x)
-
TF[state][x] = AtuomatonMatcher.getNextState(pat, M, state, x);
-
}
-
-
/* 查找模式串 */
-
public static void matcher(char[] pat, char[] txt){
-
int M = pat.length;
-
int N = txt.length;
-
//TF数组存储FA有限状态机
-
int[][] TF=new int[M+1][NO_OF_CHARS];
-
AtuomatonMatcher.computeTF(pat, M, TF);//计算模式pat的有限自动机
-
// Process txt over FA.
-
int i, state=0;
-
for (i = 0; i < N; i++) {
-
state = TF[state][txt[i]];
-
if (state == M){
-
int index=i-M+1;
-
System.out.println("pattern found at index:"+index);
-
}
-
}
-
}
-
-
public static void main(String[] args){
-
String strTxt="AABAACAADAABAAABAA";
-
String strPat="AABA";
-
char[] txt = strTxt.toCharArray();
-
char[] pat = strPat.toCharArray();
-
AtuomatonMatcher.matcher(pat, txt);
-
}
-
}
执行结果:
-
pattern found at index:0
-
pattern found at index:9
-
pattern found at index:13
相关推荐
使用有限自动机做字符串匹配 automata string match
在这个“有穷自动机字符串匹配小软件”中,开发者利用了这一概念来实现高效的字符串查找功能。VC++是Microsoft开发的一款集成开发环境,常用于编写Windows平台的应用程序,此处显然被用来开发这个小软件。 字符串...
它在ACM(国际大学生程序设计竞赛)中也是一项重要的算法技能,因为它能高效地解决字符串匹配问题,特别是面对大量模式字符串时。 AC自动机的核心思想是构建一个状态转移图,每个状态代表一个前缀字符串,状态间的...
在计算机科学中,有限自动机主要用于处理形式语言,特别是文本解析、编译器设计和模式匹配等领域。在这个场景中,我们讨论的是如何使用VC++编程环境,结合MFC(Microsoft Foundation Classes)库来实现一个有限...
AC自动机算法的实现。AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章...
0869_极智开发_解读使用有限自动机进行字符串匹配及示例代码
AC算法是一种经典的多模式字符串匹配算法,能够同时查找文本串中的多个模式串。该算法的核心思想是构建一个有限状态自动机(FSA),该自动机包含所有模式串的信息。通过这种方式,可以在一次遍历中完成对文本串的多...
《多模式字符串匹配算法——AC_BM算法的深度解析与实现》 字符串匹配算法是计算机科学中的一个重要领域,尤其在文本处理、搜索引擎、数据挖掘等领域有着广泛应用。其中,AC_BM算法,即Aho-Corasick算法结合Boyer-...
根据提供的信息,《PDF电子书《柔性字符串匹配》》主要探讨了与字符串匹配相关的算法知识。字符串匹配是计算机科学中的一个核心问题,在文本处理、搜索引擎、生物信息学等多个领域都有着广泛的应用。下面将从不同的...
总结起来,Aho-Corasick算法是字符串匹配领域的一个强大工具,它通过字典树和有限状态自动机的结合,实现了对多个模式串的一次性高效查找。在处理大量字符串匹配问题时,该算法能够显著提高性能,节省计算资源。在...
而 AC 自动机(Aho-Corasick 算法)则是在 Trie 树的基础上,增加了失败指针,使得在主串中遇到不匹配字符时,能够快速跳转到下一个可能匹配的位置,避免了重复的子串比较。 总的来说,字符串匹配算法的选择取决于...
在IT行业中,字符串匹配是计算机科学的一个重要领域,特别是在编程语言如Swift和Objective-C(OC)中。这里我们将深入探讨标题和描述中提到的“KMP匹配”和“AC多模字符串匹配”,以及它们在Swift开发中的应用。 ...
在Java中实现DFA,首先需要定义状态类,包含状态标识、是否为初始状态和是否为接受状态等属性。接着,创建一个类来表示整个自动机,它应包含状态集、转移函数以及方法来执行输入字符的处理。转移函数通常以状态和...
在预处理阶段,AC自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。 在搜索查找阶段,则通过这三个函数的交叉使用扫描文本,定位出关键字在文本中的所有...
自动机理论、语言和计算导论课后习题答案 自动机理论是计算机科学和数学中的一门重要分支,它研究的是自动机和形式语言的理论。自动机是指可以在有限步骤内解决问题的机器,形式语言是指可以被自动机识别和生成的一...
简单字符串匹配算法是最基础的一种方法,其基本思想是从文本串的第一个字符开始,逐个比较文本串中的字符与模式串中的字符是否相同。如果全部字符都匹配,则表示找到模式串;如果有任何字符不匹配,则将模式串向右...
BNDM算法正是在这种背景下应运而生,它旨在融合效率与灵活性,通过结合位并行技术和后缀自动机的优点,实现更高效、更灵活的字符串匹配。 #### 位并行技术(Bit-Parallelism) 位并行技术利用了现代计算机处理器...
字符串匹配是计算机科学中的一个重要领域,它涉及到在主文本中查找一个...提供的压缩包文件包含了各种字符串匹配算法的实现和源代码,通过学习和研究这些资源,可以加深对这些算法的理解,并将它们应用到实际项目中。
AC自动机是一种高效的多模式串匹配算法,主要应用于文本处理中的敏感词过滤、关键词搜索等功能。它的全称为Aho-Corasick算法,由Aho和Corasick在1975年提出。AC自动机在Trie树的基础上进行了扩展,增加了失败指针,...
AC自动机算法(Aho-Corasick 多模式匹配算法)C#实现