以下是使用Java实现KMP算法的示例代码:
public class KMPAlgorithm {public static void main(String[] args) {String pattern = "abc";String text = "abcdefabcghi";int[] lps = computeLPSArray(pattern);int index = search(text, pattern, lps);if (index != -1) {System.out.println("Pattern found at index " + index);} else {System.out.println("Pattern not found");}}public static int[] computeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int len = 0;int i = 1;lps[0] = 0; // lps[0] is always 0// the loop calculates lps[i] for i = 1 to pattern.length()-1while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;i++;} else {if (len != 0) {len = lps[len - 1];} else {lps[i] = 0;i++;}}}return lps;}public static int search(String text, String pattern, int[] lps) {int i = 0; // index for textint j = 0; // index for patternwhile (i < text.length()) {if (text.charAt(i) == pattern.charAt(j)) {i++;j++;} else {if (j != 0) {j = lps[j - 1];} else {i++;}}if (j == pattern.length()) {return i - j; // found at index i-j, where j is the length of pattern}}return -1; // not found}
}
在上面的代码中,我们首先使用computeLPSArray()方法计算模式字符串的最长公共前缀和后缀(LPS)数组。该方法计算了每个位置的最长公共前缀和后缀的长度。然后,我们使用search()方法在文本字符串中搜索模式字符串。该方法使用LPS数组来跳过不必要的比较,从而提高搜索效率。如果找到模式字符串,则返回其在文本字符串中的索引,否则返回-1。