假期实在无聊赖啊。把这个算法实现了一下即算是打发时间也算练练手了。
KMP算法的关键是用归纳法计算失败函数。网上很详细了。下面直接给出代码。
/** * * @author Vincent * */ public class PatternMap { private String pat; //模式 private int [] f; //模式对应的失败函数 private String source; //目标 PatternMap(String p,String s){ pat=p;source=s;f=new int[pat.length()]; } int KMP_FastFind(){ Fail(); int p=0,s=0; int m=pat.length(),n=source.length(); while(p<m&&s<n){ if(pat.charAt(p)==source.charAt(s)){ p++;s++; } else if(p==0)s++; else p=f[p-1]+1; } if(p<m) return -1; return s-m; //下标从0开始 } void Fail(){ int m=pat.length(); f[0]=-1; int i=0; for(int j=1;j<m;j++){ i=f[j-1]; while( (pat.charAt(j)!=pat.charAt(i+1)) && (i>0) ){ i=f[i]; } if(pat.charAt(j)==pat.charAt(i+1)){ f[j]=i+1; } else f[j]=-1; } } public static void main(String[] args){ PatternMap pm=new PatternMap("vince_iamvincent","vincevince_iamvincentaaa"); System.out.println(pm.KMP_FastFind()); /* * print 失败函数 */ int m=pm.pat.length(); for(int i=0;i<m;i++){ System.out.println(pm.f[i]); } } }