java实现KMP算法源码
时间: 2023-09-19 07:07:20 浏览: 159
以下是KMP算法的Java实现示例:
```java
import java.util.ArrayList;
import java.util.List;
public class KMPAlgorithm {
public static List<Integer> kmp(String text, String pattern) {
List<Integer> positions = new ArrayList<>();
int n = text.length();
int m = pattern.length();
int[] lps = buildLPS(pattern);
int i = 0; // text中的指针
int j = 0; // pattern中的指针
while (i < n) {
if (text.charAt(i) == pattern.charAt(j)) {
i++;
j++;
}
if (j == m) {
positions.add(i - j);
j = lps[j - 1];
} else if (i < n && text.charAt(i) != pattern.charAt(j)) {
if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
return positions;
}
private static int[] buildLPS(String pattern) {
int m = pattern.length();
int[] lps = new int[m];
int len = 0; // 最长公共前后缀的长度
lps[0] = 0; // 第一个字符没有最长公共前后缀
for (int i = 1; i < m; ) {
if (pattern.charAt(i) == pattern.charAt(len)) {
lps[i] = len + 1;
len++;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
return lps;
}
public static void main(String[] args) {
String text = "ABABDABACDABABCABAB";
String pattern = "ABABCABAB";
List<Integer> positions = kmp(text, pattern);
if (positions.isEmpty()) {
System.out.println("Pattern not found in the text.");
} else {
System.out.print("Pattern found at positions: ");
for (int pos : positions) {
System.out.print(pos + " ");
}
System.out.println();
}
}
}
```
以上代码是KMP算法的Java实现示例,用于在文本串中查找模式串的出现位置。你可以将文本串和模式串替换为你自己的字符串进行测试。运行程序后,它会输出模式串在文本串中的出现位置。如果没有找到匹配的位置,则会输出"Pattern not found in the text."。
阅读全文