KMP算法主要是要计算匹配字符的前缀表(prefix table),
举例:如下面字符串的前缀表就是阴影框框中的部分。利用前缀表来进行匹配
例子:(匹配字符)p=ABABCABAA, (待匹配字符)t=ABABABABCABAAB
具体主要就是求前缀表,然后将前缀表往前移1,并将第一个置-1,然后和待匹配的字符串进行匹配,下面是代码,主要借鉴的是b站一个up主的讲解:https://www.bilibili.com/video/av11866460/?spm_id_from=333.788.videocard.0 ,https://www.bilibili.com/video/av16828557/?spm_id_from=333.788.videocard.0
public class stringKMP {
public int[] getPrefix(String p){
int[] prefix=new int[p.length()];
prefix[0]=0;
int len=0;
int i=1;
while(i<p.length()){
if(p.charAt(i)==p.charAt(len)){
len++;
prefix[i]=len;
i++;
}
else{
if(len>0){
len=prefix[len-1];
}
else{
prefix[i]=len;
i++;
}
}
}
return prefix;
}
public int[] movePrefix(int[] prefix){
int n=prefix.length;
for(int i=n-1;i>0;i--){
prefix[i]=prefix[i-1];
}
prefix[0]=-1;
return prefix;
}
public void kmpSearch(String text,String pattern,int[] prefix){
//text,i,m
//pattern,j,n
int i=0,j=0;
while(i<text.length()){
if(j==pattern.length()-1&&text.charAt(i)==pattern.charAt(j)){
System.out.printf("found pattern at%d\n",i-j);
j=prefix[j];
}
if(text.charAt(i)==pattern.charAt(j)){
i++;
j++;
}
else{
j=prefix[j];
if(j==-1){
i++;
j++;
}
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
stringKMP kmp=new stringKMP();
int[] prefix=kmp.getPrefix("ABABCABAA");
prefix=kmp.movePrefix(prefix);
kmp.kmpSearch("ABABABABCABAAB","ABABCABAA", prefix);
}
}