package com.baidu;
import java.util.Arrays;
public class KMP {
public static void main(String [] args){
int [] next=new int[7];
char [] big="ababxbababcdabdabcadfdsss".toCharArray();
char [] shortt="abcdabd".toCharArray();
//0123456
// 0111123
kmp(big,shortt,next);
System.out.println("next数组的内容为:"+Arrays.toString(next));
}
public static void makeNext(char shortt[],int next[]){
next[0]=0;//模板字符串的第一个字符的最大前后缀长度为0
next[1]=1;
for(int i=2,k=0;i<shortt.length;++i){//for循环,从第二个字符开始,依次计算每一个字符对应的next值
while(k>0&&shortt[i-1]!=shortt[k]){//递归的求出p[0]...p[q]的最大前后缀长度
k=next[k-1];
}
if(shortt[i-1]==shortt[k]){//如果相等,那么最前后缀长度加1
k=next[i-1]+1;
}else{
k=1;
}
next[i]=k;
}
}
public static boolean kmp(char big[],char shortt[],int next[]){
makeNext(shortt, next);
for(int i=0,j=0;i<big.length;i++){
if(j>0&&shortt[j]!=big[i]){
j=next[j-1];
}
if(shortt[j]==big[i]){
j++;
}
if(j==shortt.length){
System.out.println("匹配成功");
return true;
}
}
System.out.println("匹配失败");
return false;
}
}