📅  最后修改于: 2023-12-03 15:40:54.725000             🧑  作者: Mango
KMP 算法(Knuth-Morris-Pratt 算法)是一种用于字符串匹配的算法,可以在一个主字符串中查找一个特定的子字符串。它的时间复杂度为 O(m + n),其中 m 是匹配字符串的长度,n 是主字符串的长度。
在 KMP 算法中,我们通过计算子串的前缀和后缀的最长公共长度来确定每次比较中移动的步数,从而避免了在主串中随意移动的情况。
以下是使用 Java 实现的 KMP 算法代码片段:
public class KMP {
public int[] computeTempArray(String pat) {
int i = 0, j = 1;
int[] lps = new int[pat.length()];
while (j < pat.length()) {
if (pat.charAt(i) == pat.charAt(j)) {
lps[j++] = ++i;
} else {
if (i != 0) {
i = lps[i - 1];
} else {
lps[j++] = 0;
}
}
}
return lps;
}
public void KMPSearch(String pat, String txt) {
int[] lps = computeTempArray(pat);
int i = 0, j = 0;
while (i < txt.length()) {
if (pat.charAt(j) == txt.charAt(i)) {
i++;
j++;
}
if (j == pat.length()) {
System.out.println("Pattern found at index " + (i - j));
j = lps[j - 1];
} else if (i < txt.length() && pat.charAt(j) != txt.charAt(i)) {
if (j != 0) {
j = lps[j - 1];
} else {
i++;
}
}
}
}
public static void main(String[] args) {
KMP kmp = new KMP();
String txt = "ABCABCDABABCDABCDABDE";
String pat = "ABCDABD";
kmp.KMPSearch(pat, txt);
}
}
在上面的代码片段中,computeTempArray
方法负责计算子串的前缀和后缀的最长公共长度,这个长度数组用于在主串中移动检索位置。
KMPSearch
方法则是实际的搜索实现。在 KMPSearch
方法中,我们首先计算出子串的最长公共前缀和后缀,然后在主串中从头开始搜索。每次比对都会移动子串的位置,直到找到所有匹配的结果。
以上就是一个用于模式搜索的 KMP 算法的 Java 程序,它可以帮助程序员在处理字符串匹配的时候提高效率。