KMP算法java实现
注意几点,kmp如此简单
1.关于k的意义必须明确他是代表前缀和后缀所以子集的交集。(拿abc来说前缀有a,ab,后缀有bc,c,此时k为0)
2.只有了解前缀和后缀的定义,才能很轻松的明白不满足是回退的操作k=next[k-1];
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String tarStr = scanner.nextLine();
String partten = scanner.nextLine();
// 手撕kmp
int[] next = getNext(partten);
System.out.println(Arrays.toString(next));
for (int i=0,j=0;i<tarStr.length();i++){
while(j>0 && tarStr.charAt(i)!=partten.charAt(j)){
j = next[j-1];
}
if(tarStr.charAt(i)==partten.charAt(j)){
j++;
}
if(j==partten.length()){
System.out.println(i-j+1);
j = 0;
}
}
}
private static int[] getNext(String partten){
int[] nextArr = new int[partten.length()];
nextArr[0] = 0;
for (int i=1,k=0;i<partten.length();i++){
if(partten.charAt(i)==partten.charAt(k)){
k++;
}
while(k>0 && partten.charAt(k)!=partten.charAt(i)){
k = nextArr[k-1];
}
nextArr[i] = k;
}
return nextArr;
}
大喊一声江哥牛逼