1.核心是求next数组
2.考虑两种情况:
-当p[j] == p[k]时,当前的next等于上一个next加一
-当p[j] != p[k]时
package com.company; import java.util.Scanner; public class kmp { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str1 = in.next(); String str2 = in.next(); int[] next = getNext(str2.toCharArray()); getkmp(str1.toCharArray(), str2.toCharArray(), next); } public static int[] getNext(char str[]){ int[] next = new int[1005]; int n = str.length; next[0] = -1; int k = -1; int j = 0; while (j < n){ if (k == -1 || str[k] == str[j]){ k++; j++; next[j] = k; } else{ k = next[k]; } } for(int i = 0; i < n; i++){ System.out.printf("%d ", next[i]); } System.out.println(); return next; } public static void getkmp(char str1[], char str2[], int next[]){ int len1 = str1.length; int len2 = str2.length; int i = -1; int j = -1; while(i < len1 && j < len2){ if (j == -1 || str1[i] == str2[j]){ i++; j++; } else { j = next[j]; } System.out.printf("%d, %d\n", i, j); } if (j == len2) System.out.println(i-j); else System.out.println("no"); } }