KMP
import java.util.Arrays;
public class Main {
public static int kmp (String str,String pattern){
if(pattern.length() == 0 ){
return 0;
}
// 这个kmp 的思路是按照 【最浅显易懂的 KMP 算法讲解】 https://www.bilibili.com/video/BV1AY4y157yL?share_source=copy_web&vd_source=e6456becec4a516c72331c90cbc9616b
// 构造next数组 前后缀相同的最大长度,不包括字符串本身
int[] next = new int[pattern.length()];
next[0] = 0;
for(int j = 1 ;j <pattern.length();j++){
int i = next[j-1]; // next 数组就是可以跳过开头多少个字符,直接匹配第i个字符
if(pattern.charAt(i) == pattern.charAt(j)){
next[j] = i+1; // 说明可以再多跳一个
}else{
while(pattern.charAt(i) != pattern.charAt(j)){
if(i>=1){
i = next[i-1];
}else{
next[j] = 0; // 没有可以跳过的
break;
}
}
// 说明找到了一个
if(pattern.charAt(i) == pattern.charAt(j)){
next[j] = i+1;
}
}
}
// 开始匹配
int i = 0;
int j = 0;
while(i< str.length() && j < pattern.length()){
if(str.charAt(i) == pattern.charAt(j)){
i++;
j++;
}else{
if(j==0){
i++;
}else{
j = next[j-1];
}
}
}
if(j == pattern.length()){
return i-j;
}else{
return -1;
}
}
public static void main(String[] args) {
System.out.println(kmp("ABABABCAA", "AA"));
}
}