kmp算法
首先咱们先求next数组
代码如下
public int[] kmpnext(String dest){
int []next=new int[dest.length()];
next[0]=0;
for(int i=1,j=0;i<dest.length();i++){
while(j>0 && dest.charAt(j)!=dest.charAt(i)){
j=next[j-1];
}
if(dest.charAt(i)==dest.charAt(j)){
j++;
}
next[i]=j;
}
return next;
}
可能有点难度,我们来举个例子分析一下这个代码,看看他是怎么运行的。
假设:dest=“acdbcacda”;
根据咱们的写的代码一步一步的来
因为j现在没有大于0所以不会执行while循环的代码,
又因为dest.charAt(i)!=dest.charAt(j),j++也没有执行。
所以直接执行了next[i]=j这行代码
一直下去,直到dest.charAt(i)==dest.charAt(j)
如下:
j++开始执行了,直到遇到下面这种情况
进入了while循环,一直循环到j=0这个条件或者dest[j]==dest[i]的条件退出
又因为当j=0时,dest[j]==dest[i]成立,所以j++又执行了一次,于是得到下面这个数组
这个数组就是我们要求的next数组