KMP演算法-一種改進的模式匹配
阿新 • • 發佈:2018-12-10
時間複雜度:O(n+m)
next陣列:若next[i]=k,則next[i]表明當模式中第j個字元與主串中相應字元“失配”時,在模式中需要重新和主串中該字元進行比較的字元的位置。定義如下。
package com.uply.javanetwork; /** * @author Uply * @since 2018/9/16 */ public class KMP { /** * * @param a 模式 * @param b * @return */ public static boolean compare(String a, String b) { if (a == null || b == null ||a.length() == 0 || b.length() == 0) return false; int[] next = getNext(a); int i = 1, j = 1; int alen = a.length(), blen = b.length(); while (i <= alen && j <= blen) { if (i == 0 || a.charAt(i - 1) == b.charAt(j - 1)) { i++; j++; } else { i = next[i - 1]; } } if (i > alen) return true; return false; } private static int[] getNext(String str) { int i = 1, j = 0; int[] next = new int[str.length()]; next[0] = 0; while (i < str.length()) { if (j == 0 || str.charAt(i - 1) == str.charAt(j - 1)) { i++; j++; next[i - 1] = j; } else { j = next[j - 1]; } } return next; } public static void main(String[] args) { System.out.println(KMP.compare("abaabcac", "acabaabaabcacaabc")); for (int i : KMP.getNext("abaabcac")) System.out.println(i); } }