KMP算法是在字符串M中查找是否包含字符串N,存在返回字符串M匹配的字符首位置,将复杂度O(mn)降为O(m+n)
要看对KMP算法的理解,请参考字符串匹配的KMP算法
要看其中对匹配表的理解,请参考 KMP算法最浅显理解——一看就明白
下面是基于算法整理的Java代码:
public class KMP {
private static int[] getNext(String b) {
int len = b.length();
int j = 0;
int next[] = new int[len + 1];
next[0] = next[1] = 0;
for (int i = 1; i < len; i++) {
while (j > 0 && b.charAt(i) != b.charAt(j)) {
j = next[j];
}
if (b.charAt(i) == b.charAt(j)) {
j++;
}
next[i + 1] = j;
}
return next;
}
public static List<Integer> search(String original, String find) {
List<Integer> pos = new ArrayList<Integer>();
int[] next = getNext(find);
int j = 0;
for (int i = 0; i < original.length(); i++) {
while (j > 0 && original.charAt(i) != find.charAt(j))
j = next[j];
if (original.charAt(i) == find.charAt(j)) {
j++;
}
if (j == find.length()) {
pos.add(i - j + 1);
j = 0;
}
}
return pos;
}
public static int searchFirst(String original, String find) {
int pos = -1;
int[] next = getNext(find);
int j = 0;
for (int i = 0; i < original.length(); i++) {
while (j > 0 && original.charAt(i) != find.charAt(j))
j = next[j];
if (original.charAt(i) == find.charAt(j)) {
j++;
}
if (j == find.length()) {
pos = i - j + 1;
break;
}
}
return pos;
}
public static void main(String[] args) {
String a = "abcaabababaa";
String b = "abaa";
//List<Integer> aaa = search(a, b);
int bbb = searchFirst(a, b);
//System.out.println(aaa);
System.out.println(bbb);
}
}