如何通過Java程式碼實現KMP演算法
阿新 • • 發佈:2020-01-07
這篇文章主要介紹瞭如何通過Java程式碼實現KMP演算法,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
KMP演算法是一種改進的字串匹配演算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱KMP演算法)。KMP演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現一個next()函式,
函式本身包含了模式串的區域性匹配資訊。時間複雜度O(m+n)。
程式碼如下
import java.util.Arrays; public class Test { /** * @param str 文字串 * @param dest 模式串 * @param next 匹配核心陣列 * @return */ public static int kmp(String str,String dest,int[] next) { for(int i = 0,j = 0; i < str.length(); i++){ if (j > 0 && str.charAt(i) != dest.charAt(j)) { j = next[j - 1]; } if (str.charAt(i) == dest.charAt(j)) { j++; } if (j == dest.length()) { return i-j+1; } } return 0; } public static int[] kmpnext(String dest) { int[] next = new int[dest.length()]; next[0] = 0; for(int i = 1,j = 0; i < dest.length(); i++) { if (j > 0 && dest.charAt(j) != dest.charAt(i)) { j = next[j - 1]; } if (dest.charAt(i) == dest.charAt(j)) { j++; } next[i] = j; } return next; } public static void main(String[] args){ String a = "ABABAE"; String b = "ABABABABAEBEABADAEABAEABABAE"; int[] next = kmpnext(a); System.out.println(Arrays.toString(next)); int res = kmp(b,a,next); System.out.println(res); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。