KMP算法java实现之策略模式

来源:互联网 发布:淘宝商城女包特卖 编辑:程序博客网 时间:2024/05/16 04:56
KMP算法是个经典的算法,网上很多大神都给出了很详细的说明,在此不再赘述。

下面是KMP算法的实现,使用的是策略模式。


public interface INextBuilder {public abstract int[] build(char[] p);}

编写INextBuilder接口的递归思想实现

package com.soft.kmp;public class RecurNextBuilder implements INextBuilder  {@Overridepublic int[] build(char[] p) {int[] next=new int[p.length];int k=-1;next[0]=-1;//遍历0->p.length-1for(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 {@Overridepublic 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

0 0