Java实现算法导论中有限自动机字符串匹配算法
来源:互联网 发布:仿真优化软件 编辑:程序博客网 时间:2024/05/28 06:04
这里实现了基于有限自动机(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:0pattern found at index:9pattern found at index:13
0 0
- Java实现算法导论中有限自动机字符串匹配算法
- 字符串匹配之有限自动机&kmp算法
- 【算法】利用有限自动机进行字符串匹配
- 字符串匹配算法之:有限状态自动机
- Java实现算法导论中朴素字符串匹配算法
- Java实现算法导论中Rabin-Karp字符串匹配算法
- Java实现算法导论中KMP字符串匹配算法
- 算法——字符串匹配之有限自动机算法
- 字符串匹配算法——利用有限自动机进行匹配
- 算法导论-第32章-字符串匹配:有限自动机方法(改进版本:预处理阶段复杂度为O(m*| ∑ |) )C++实现
- 字符串匹配(string matching)算法之二:利用有限自动机
- 算法-字符串匹配(String Matching)-(2)-有限自动机
- 字符串匹配(string matching)算法之二:利用有限自动机
- 有限自动机字符串匹配_KMP算法计算状态转换表
- 字符串匹配的FA(有限状态自动机)算法
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- KMP字符串匹配算法(一)—模式字符串的匹配有限自动机
- DPM物体检测相关
- MyBatis——动态SQL讲解
- Facebook开源TorchCraft,让每个人都能编写星际争霸AI玩家
- java Timer 定时每天凌晨1点执行任务
- jar包
- Java实现算法导论中有限自动机字符串匹配算法
- 详细介绍什么是卡片式设计用户界面
- 关于如何写UI及屏幕适配的一些技巧(上)——颜婧
- akka 2.3.11 实例
- iOS 网络请求设置https连接方式
- 一次完整的HTTP通信中,web浏览器和web服务器之间完成的七个步骤
- 使用APK分析器分析您的构建
- sip.js基于 FreeSwitch的使用过程
- Android开发:屏蔽Home键功能后,对话框显示不正常问题