啊嘞...已经在word里准备好惹,但是感觉好像这里编辑器不太会用或者说不太完全...截图吧
内容基本上参考于第四版数据结构与算法(电子工业出版社)。断断续续研读了几天,自己理了一下。
好了,这是next改进之前的代码
package test;
public class KMP {
public static void main(String[] args){
String target = "abcdabcabbabcabc";
String pattern = "abcabc";
System.out.println(indexOf(target,pattern));
}
public static int indexOf(String target,String pattern){
return indexOf(target,pattern,0);
}
public static int indexOf(String target,String pattern,int begin){
//求出目标字符串和模式字符串的长度
int n = target.length();
int m = pattern.length();
if(begin<0){
begin = 0;
}
if(n == 0 || n < m || begin >= n){
return -1;
}
int[] next = getNext(pattern);
//用begin定义目标字符串中开始的位置i,模式字符串中从j=0开始比较
int i = begin, j = 0;
while(i < n && j < m){
if(j == -1 || target.charAt(i) == pattern.charAt(j)){
i++;
j++;
}else{
j = next[j];
if(n-i+1<m-j+1)
break;
}
}
if(j == m){
return i-j;
}
return -1;
}
private static int[] getNext(String pattern){
int j = 0,k = -1;
int next[] = new int[pattern.length()];
next[0] = -1;
while(j<pattern.length()-1){
if(k == -1 || pattern.charAt(k) == pattern.charAt(j)){
j++;
k++;
next[j] = k;
}else{
k = next[k];
}
}
return next;
}
}
改进之后
private static int[] getNext(String pattern){
int j = 0,k = -1;
int next[] = new int[pattern.length()];
next[0] = -1;
while(j<pattern.length()-1){
if(k == -1 || pattern.charAt(k) == pattern.charAt(j)){
j++;
k++;
if(pattern.charAt(j) != pattern.charAt(k)){
next[j] = k;
}else{
next[j] = next[k];
}
}else{
k = next[k];
}
}
return next;
}
KMP算法最好情况比较次数为m,最坏情况比较次数为n+m。时间复杂度为O(n)。