这里实现了基于有限自动机(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

Java实现算法导论中有限自动机字符串匹配算法相关推荐

  1. Java实现算法导论中朴素字符串匹配算法

    朴素字符串匹配算法沿着主串滑动子串来循环匹配,算法时间性能是O((n-m+1)m),n是主串长度,m是字串长度,结合算法导论中来理解,具体代码参考: package cn.ansj;public cl ...

  2. Java实现算法导论中Rabin-Karp字符串匹配算法

    Rabin-Karp算法的思想: 假设子串的长度为M,目标字符串的长度为N 计算子串的hash值 计算目标字符串中每个长度为M的子串的hash值(共需要计算N-M+1次) 比较hash值 如果hash ...

  3. Java实现算法导论中KMP字符串匹配算法

    "前缀"和"后缀". "前缀"指除了最后一个字符以外,一个字符串的全部头部组合:"后缀"指除了第一个字符以外,一个字符串 ...

  4. Java实现算法导论中Miller-Rabin随机性素数测试

    Miller-Rabin测试: 费马小定理:对于素数p和任意整数a,有ap ≡ a(mod p)(同余).反过来,满足ap ≡ a(mod p),p也几乎一定是素数. 伪素数:如果n是一个正整数,如果 ...

  5. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  6. Java实现算法导论中反复平方法模取幂

    在众多的加密算法中都需要进行幂的取模运算,比如在RSA算法中需要计算d=ne mod N,我们称之为幂模算法,其中: N=p*q(p,q为大素数) n为加密数据,n<N e为公钥,d为私钥,满足 ...

  7. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  8. Java实现算法导论中快速傅里叶变换FFT递归算法

    要结合算法导论理解,参考:http://blog.csdn.net/fjssharpsword/article/details/53281889 代码中算法思路:输入n位(2的幂)向量,分别求值FFT ...

  9. Java实现算法导论中Pollard的rho启发式方法

    Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...

最新文章

  1. java中file类_Java中file类
  2. Koa源码分析(二) -- co的实现
  3. 嵌入生活的嵌入式,超市里的电子价签
  4. 自我理解的KMP 算法 模式匹配
  5. 微服务升级_SpringCloud Alibaba工作笔记0004---认识spring gateway理解新一代网关
  6. amoeba安装与简单使用(一)
  7. 有哪些特点_锌钢栅栏有哪些特点?锌钢栅栏特点有哪些?
  8. 数据结构:内排序(C++)
  9. Notepad++安装NppFTP插件
  10. CPT104 计算机操作系统概念笔记
  11. 用猿大师VLC播放程序与海康威视官方播放器在高版本Chrome播放RTSP视频流延迟效果对比!(视频演示)
  12. iOS 9 真机调试
  13. 奥维互动地图如何删除标签_奥维互动地图浏览器标签附件添加设置方法
  14. python 魔法方法(2)
  15. WORD里的拼页、书籍折页、反向书籍折页功能(一)
  16. Ubuntu下flash运行方法(2020.12后可用)
  17. 竟然是 300 万的诈骗案!
  18. 移植usb无线网卡驱动
  19. 错误处理--CUDA error: device-side assert triggered(很有效)
  20. 重装系统当识别不到硬盘的解决办法

热门文章

  1. Spark详解(十一):Spark运行架构原理分析
  2. Java高并发编程:取消和关闭
  3. html怎么设置页面自适应屏幕大小,网页设计设置页面自适应屏幕宽度
  4. java 类 clone_Java Clone(类的复制)实例代码
  5. git--分支管理策略
  6. Win2008 r2 iis7/iis7.5系统下HTTP重定向(301重定向)图文方法
  7. log4j的使用 与 父接口 slf4j 门面模式(外观模式)
  8. 软件工程第二次作业——模仿主流网站:搜狗输入法
  9. HTML5(W3CSchool版).chm
  10. Microstation研发