用Java 代码讲解一下 kmp算法
时间: 2023-07-09 20:26:24 浏览: 110
好的,以下是用 Java 代码讲解 kmp 算法:
```java
public class KMP {
/**
* 计算next数组
*
* @param pattern 模式串
* @return next数组
*/
private static int[] getNext(String pattern) {
int[] next = new int[pattern.length()];
int j = 0;
for (int i = 1; i < pattern.length(); i++) {
while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) {
j = next[j - 1];
}
if (pattern.charAt(i) == pattern.charAt(j)) {
j++;
}
next[i] = j;
}
return next;
}
/**
* kmp算法
*
* @param text 文本串
* @param pattern 模式串
* @return 返回模式串在文本串中的起始位置,若不存在则返回-1
*/
public static int kmp(String text, String pattern) {
int[] next = getNext(pattern);
int j = 0;
for (int i = 0; i < text.length(); i++) {
while (j > 0 && text.charAt(i) != pattern.charAt(j)) {
j = next[j - 1];
}
if (text.charAt(i) == pattern.charAt(j)) {
j++;
}
if (j == pattern.length()) {
return i - j + 1;
}
}
return -1;
}
public static void main(String[] args) {
String text = "ababababc";
String pattern = "ababc";
int index = kmp(text, pattern);
System.out.println(index); // 输出3
}
}
```
首先实现了一个 getNext 方法,该方法用于计算模式串的 next 数组,接着实现了 kmp 方法,该方法用于在文本串中查找模式串的位置,最后在 main 方法中测试了一下 kmp 方法。
其中,next 数组的含义是:对于每个位置 i,表示 pattern[0:i] 这个子串的前缀和后缀的最长公共部分的长度。
在 kmp 方法中,j 表示当前匹配到了模式串的哪个位置,如果匹配失败,则根据 next 数组移动 j 的位置,直到匹配成功或者匹配到了文本串的末尾。如果 j 等于模式串的长度,说明匹配成功,返回模式串在文本串中的起始位置。
以上就是 kmp 算法的 Java 实现,希望对你有帮助。
阅读全文