Java实现算法导论中有限自动机字符串匹配算法
生活随笔
收集整理的這篇文章主要介紹了
Java实现算法导论中有限自动机字符串匹配算法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這里實(shí)現(xiàn)了基于有限自動(dòng)機(jī)(Finite Automaton,FA)的模式匹配算法,算法的重點(diǎn)在于利用字符串的前后綴構(gòu)造模式P的自動(dòng)機(jī),具體結(jié)合導(dǎo)論中的說明來理解,可參考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;//假設(shè)字母表有256個(gè)字符//對于狀態(tài)k和給定的字符x,返回下一個(gè)狀態(tài)。M為pat的長度public static int getNextState(char[] pat, int M, int k, int x){// 因?yàn)?pat[0...k-1]x 和 pat 的前面都是是一樣的,如果x == pat[k]可直接返回。if (k < M && x == pat[k])return k+1;int ns, i; // ns 是下一個(gè)狀態(tài)// ns 最終是最長的那個(gè) prefix (同時(shí)也是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;}/* 構(gòu)建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數(shù)組存儲FA有限狀態(tài)機(jī)int[][] TF=new int[M+1][NO_OF_CHARS];AtuomatonMatcher.computeTF(pat, M, TF);//計(jì)算模式pat的有限自動(dòng)機(jī)// 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);} }執(zhí)行結(jié)果: pattern found at index:0 pattern found at index:9 pattern found at index:13
總結(jié)
以上是生活随笔為你收集整理的Java实现算法导论中有限自动机字符串匹配算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker初识之Centos6.2下安
- 下一篇: Java实现从Html文本中提取纯文本