思路
我就不提为啥有KMP和KMP的原理了,这段跳过。。。
首先计算next数组,算法如下:
输入:String m;
输出:int[] next;
1.next[0]=0;
2.计算next[i]:
从j=next[i-1]开始,可以得到m[i-1]的next值,辣么如果,m[i]=m[j],说明next[i]=next[i-1]+1(就是多匹配上了一个)
如果m[i]!=m[j],辣么我们需要去看比j短1的字符串是否匹配上,就是j=next[j-1],知道找到一个m[i]=m[j]或者是匹配到0.
3.输出next
有了next数组,KMP的匹配和计算next数组就惊人的相似了,其实也是一个东西,是不是很神奇~~~
就酱!
Code
public class MyKMP {
public int kmp(String s, String m) {
int[] next = kmp(m);
int j = 0;
for (int i = 0; i < s.length(); i++) {
while (j > 0 && s.charAt(i) != m.charAt(j))
j = next[j];
if (s.charAt(i) == m.charAt(j))
j++;
if (j == m.length()) {
return i - j + 1;
}
}
return -1;
}
public int[] kmp(String m) {
int[] next = new int[m.length()];
int len = m.length();
int i, j = 0;
next[0] = 0;
for (i = 2; i < len; i++) {
while (j > 0 && m.charAt(i) != m.charAt(j)) {
j = next[j - 1];
}
if (m.charAt(i) == m.charAt(j))
j++;
next[i] = j;
}
return next;
}
public static void main(String[] args) {
String a = "0012345671234567";
String b = "1234567";
MyKMP m = new MyKMP();
System.out.print(m.kmp(a, b));
}
}