kmp算法实现

kmp核心就是求next数组,而求next数组核心就是记住,next[i]保存的是模式串当前索引不匹配是下一个应该比较的索引

public class KMP {
//p模式串
public static int match(String p,String s){
if(s.length()<p.length())
return -1;
int[] next = new int[p.length()];
next[0] = -1;
int j=-1;
int i=0;
while(i<p.length()-1){
if(j==-1||p.charAt(i)==p.charAt(j)){
j++;
i++;
next[i] = j;
//next优化
while(next[i]!=-1&&p.charAt(next[i])==p.charAt(i)){
next[i] = next[next[i]];
}
}else {
j = next[j];
}
}
i=0;
j=0;
while((s.length()-i>=p.length()-j)){
if(j==-1||s.charAt(i)==p.charAt(j)){
i++;
j++;
if(j==p.length()-1){
return i-p.length()+1;
}
}else {
j=next[j];
}
}
return -1;
}
}
posted @ 2020-12-31 21:43  codeNothing  阅读(90)  评论(0)    收藏  举报