串匹配算法大家都不陌生,其中kmp算法算是比较经典的一种算法,然而kmp算法的精髓就是寻找next[ ]数组。
主要是对匹配串的next[ ]一个求解。
package qyq.Algorithm.KMP;
/**
* KMP串匹配
* @author qi
* @creation 2012-8-14 更新至 2012年10月10日15:47:00 之前的有个小bug,现在已经调试通过,希望大家多多交流哈!
*/
public class Kmp {
public static void main(String[] args) {
String S="angcdthabc";
String T="hbc";
int lenS=S.length();
int lenT=T.length();
int next[]=new int[lenT+1];
getNext(T, next);//next[]数组的求解
for(int i=0;i<next.length;i++){//打印出next数组
System.err.println(i+":"+next[i]);
}
int kmp=K_next(S, T, lenS, lenT, next);
System.err.println("第一次匹配的位置::"+kmp);
}
public static void getNext(String T,int next[]){//这个是重点
int j=0,k=-1;
next[0]=-1;
while(j<T.length()){
if(k==-1||T.charAt(j)==T.charAt(k)){
j++;
k++;
next[j]=k;
}else {
k=next[k];
}
}
}
public static int K_next(String S,String T,int lenS,int lenT,int next[]){
int i=0,j=0;
while(i<lenS&&j<lenT){
if(j==-1||S.charAt(i)==T.charAt(j)){
i++;
j++;
}else {
j=next[j];
}
}
if(j==lenT){
return i-lenT;
}
return -1;
}
}
在求解next[ ]数组的时候,主要是求解字符串T的真前缀和真后缀。
根据上面的公式:
比如 字符串:abcdsdf
则a的next[ ] 的值设置为o,则b的为1,c的为1,依次是:1,1,1,1,1
如果是:abcabcdas
0,1,1,1,2,3,4,1,2
看明白了吗!