KMP
Knuth-Morris-Pratt 算法
字符串匹配
next数组:前缀子串的最长相同前后缀
举例:
前缀:包含第一个字母,不包含最后一个字母
后缀:包含最后一个字母不包含第一个字母
字符串 aabaac 前缀子串包含 a、aa、aab、aaba、aabaa、aabaac ;
/**
* next数组求法
* i后缀位置(next数组当前下标)
* j前缀位置(相同字符长度)
* @param s aabaac
*
*/
public int[] getNext0(String s){
char[] ch = s.toCharArray();
int j=0;
int[] next=new int[s.length()];
next[0]=0;
for(int i=1;i<s.length();i++){
if(ch[j]==ch[i]){
//前缀和后缀相同 相同字符长度+1 开始比较下一个子串的前后缀
//aa j=0 i=1 a=a next[1]=1;
j++;
} else {
while (j > 0 && ch[j] != ch[i]) {//aab j=1,i=2 a!=b j回到next[0]的位置,此时j=0跳出循环
j = next[j - 1];
}
}
next[i]=j;
}
return next;
}
KMP代码:
public void kmp(String str,String s){
int[] next = getNext0(s);
int i=0,j=0;
while(i<str.length()&&j<=s.length()){
if(str.charAt(i)==s.charAt(j)){
i++;
j++;
}else if(j>0){
j=next[j-1];
}else {
i++;
}
}
}