kmp算法实现
最近在极客时间上看王争老师的《设计模式之美》时偶然所得kmp算法,先行记录下其具体实现。
工具类
public class Util {
/**
*
* @param a 主串
* @param n 主串长度
* @param b 模式串
* @param m 模式串长度
* @return 首次匹配下标
*/
public static int kmp(char[] a, int n, char[] b, int m) {
int[] next = getNexts(b, m);
int j = 0;
for (int i = 0; i < n; ++i) {
while (j > 0 && a[i] != b[j]) {
j = next[j - 1] + 1;
}
if (a[i] == b[j]) {
++j;
}
if (j == m) {
return i - m + 1;
}
}
return -1;
}
/**
*
* @param b 模式串
* @param m 模式串长度
* @return next数组
*/
private static int[] getNexts(char[] b, int m) {
int[] next = new int[m];
next[0] = -1;
int k = -1;
for (int i = 1; i < m; ++i) {
while (k != -1 && b[k + 1] != b[i]) {
k = next[k];
}
if (b[k + 1] == b[i]) {
++k;
}
next[i] = k;
}
return next;
}
}
简单测试
public class Test {
public static void main(String[] args) {
String str1 = "ababababca";
String str2 = "abababca";
int res = Util.kmp(str1.toCharArray(),str1.length(),str2.toCharArray(),str2.length());
if(res == -1) {
System.out.println("主串不包含模式串");
} else {
System.out.println("匹配下标为:" + res);
}
}
}