您的位置:首页 > 编程语言 > Java开发

【KMP】串匹配-java代码【最新版本】

2012-08-14 15:25 260 查看
串匹配算法大家都不陌生,其中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

看明白了吗! 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string 算法 class
相关文章推荐