以下是使用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()-1
while (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 text
int j = 0; // index for pattern
while (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。