KMP算法是个经典的算法,网上很多大神都给出了很详细的说明,在此不再赘述。
运行结果:3
下面是KMP算法的实现,使用的是策略模式。
public interface INextBuilder {
public abstract int[] build(char[] p);
}
编写INextBuilder接口的递归思想实现
package com.soft.kmp;
public class RecurNextBuilder implements INextBuilder {
@Override
public int[] build(char[] p) {
int[] next=new int[p.length];
int k=-1;
next[0]=-1;
//遍历0->p.length-1
for(int i=0;i<p.length-1;i++){
if(k==-1||p[i]==p[k]){
k++;
next[i+1]=k;
}else{
k=next[k];
}
}
return next;
}
}
编写INextBuilder接口的非递归实现
package com.soft.kmp;
public class StraitNextBuilder implements INextBuilder {
@Override
public int[] build(char[] p) {
//自己来完成吧,测测你的水平
return null;
}
}
最后编写KMP类以及测
package com.soft.kmp;
public class KMP {
private INextBuilder nextBuilder;
public KMP(INextBuilder nextBuilder){
this.nextBuilder=nextBuilder;
}
public KMP() {
this.nextBuilder=new RecurNextBuilder();
}
public int KMPMatch(String s,String p){
char[] pa=p.toCharArray();
char[] sa=s.toCharArray();
int[] next=this.nextBuilder.build(pa);
for(int i=0,j=0;i<sa.length;){
if(j==-1 ||sa[i]==pa[j]){
i++;j++;
}else{
j=next[j];
}
if(j==pa.length){
return i-j;
}
}
return -1;
}
public static void main(String[] args) {
KMP kmp=new KMP();
System.out.println(kmp.KMPMatch("helllo", "llo"));
}
}
运行结果:3