刚刚学习了KMP算法的实现,在此分享一下
package Luogu;
import java.util.Scanner;
public class P3375 {
static Scanner in =new Scanner(System.in);
static int la,lb,all=0;
static int[] kmp=new int[1000005];
static String a,b;
public static void main(String[] args) {
a=in.next();
b=in.next();
la=a.length();
lb=b.length();
kmp[0]=-1; // 初始化:第0个字符的kmp更新指针位置是索引为-1的位置(-1代表一个字符都没有匹配上,从头开始匹配)
int j=-1; // b字符串的指针
// 初始化kmp数组,自己匹配自己,记录第i个字符的kmp位置
// kmp位置:该字符的-前面字符-匹配失败时,该字符指针跳转到的索引位置
for(int i=1;i<lb;i++) {
// 匹配第j+1个位置,如果匹配不成功,那么更新b指针的位置,也就是更新j,更新后继续匹配
// 直到j=-1,也就是一个都匹配不上,又或者匹配上了,才退出while
while(j!=-1&&b.charAt(i)!=b.charAt(j+1)) {
j=kmp[j];
}
if(b.charAt(i)==b.charAt(j+1)) {
// 匹配上了,b字符串指针往前移动
j++;
}
// 记录kmp位置
kmp[i]=j;
}
j=-1;
for(int i=0;i<la;i++) {
// 匹配第j+1个位置,如果匹配不成功,那么更新b指针的位置,也就是更新j,更新后继续匹配
// 直到j=-1,也就是一个都匹配不上,又或者匹配上了,才退出while
while(j!=-1&&a.charAt(i)!=b.charAt(j+1)) {
j=kmp[j];
}
if(a.charAt(i)==b.charAt(j+1)) {
// 匹配上了,b字符串指针往前移动
j++;
}
if(j==lb-1) {
// 完全匹配成功,使 j 转到 kmp 位置,继续匹配
j=kmp[j];
System.out.println(i+2-lb);
}
}
for(int i=0;i<lb;i++) {
System.out.print((kmp[i]+1)+" ");
}
}
}