package com.tobaidu.algorithm.kmp;
public class KMP {
static int[] P;
/**
* 对子串加以预处理,从而找到匹配失败时子串回退的位置
*
* @param B
* ,待查找子串的char数组
* @return
*/
public static int[] preProcess(char[] B) {
int size = B.length;
int[] P = new int[size];
P[0] = 0;
int j = 0;
for (int i = 1; i < size; i++) {
while (j > 0 && B[j] != B[i]) {
j = P[j];
}
if (B[j] == B[i]) {
j++;
}
P[i] = j;
}
return P;
}
/**
* KMP实现
*
* @param parStr
* @param subStr
* @return
*/
public static void kmp(String parStr, String subStr) {
int subSize = subStr.length();
int parSize = parStr.length();
char[] B = subStr.toCharArray();
char[] A = parStr.toCharArray();
int j = 0;
int k = 0;
for (int i = 0; i < parSize; i++) {
while (j > 0 && B[j] != A[i]) {
j = P[j - 1];
}
if (B[j] == A[i]) {
j++;
}
if (j == subSize) {
j = P[j - 1];
k++;
}
}
}
public static void main(String[] args) {
// 回退位置数组为P[0, 0, 0, 0, 0, 0]
kmp("abcdeg, abcdeh, abcdef!这个会匹配1次", "abcdef");
// 回退位置数组为P[0, 0, 1, 2, 3, 4]
kmp("Test ititi ititit! Test ititit!这个会匹配2次", "ititit");
}
}
package com.tobaidu.algorithm.kmp;
public class SubStrFind {
/**
* 字符串查找(枚举方法)
*
* @param parStr
* @param subStr
* @return
*/
public static void strFind(String parStr, String subStr) {
int parSize = parStr.length();
int subSize = subStr.length();
char[] B = subStr.toCharArray();
char[] A = parStr.toCharArray();
boolean flag = true;
int times = 0;
int j = 0;
int k = 0;// k记录父串匹配正确的位置或者匹配不正确的回退位置
// i记录父串的当前比较字符的位置
for (int i = 0; i < parSize; i++) {
if (B[j] == A[i]) {
j++;
// 第一次时记录父串回退位置
if (flag) {
k = i;
flag = false;
}
} else {
// 不匹配时回退位置重置,比较继续进行
i = ++k;
j = 0;
flag = true;
}
if (j == subSize) {
j = 0;// 匹配时只需把子串回退位置重置,比较继续进行
flag = true;
times++;
}
}
}
}
package com.tobaidu.algorithm.kmp;
public class TimeConsumer {
private static int times = 1000000;
public static void test(String parStr, String subStr) {
long start = 0;
long end = 0;
System.out.println("父串: " + parStr);
System.out.println("子串: " + subStr);
start = System.currentTimeMillis();
KMP.P = KMP.preProcess(subStr.toCharArray());
for (int i = 0; i < times; i++) {
KMP.kmp(parStr, subStr);
}
end = System.currentTimeMillis();
System.out.println("Time for KMP: " + (end - start));
start = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
SubStrFind.strFind(parStr, subStr);
}
end = System.currentTimeMillis();
System.out.println("Time for Enumeration: " + (end - start));
System.out.println("-------------------------------------");
}
public static void main(String[] args) {
test("abcdeg, abcdeh, abcdef!这个会匹配1次", "abcdef");
test("Test ititi ititititd! Test ititititd!这个会匹配2次", "ititititd");
}
}
分享到:
相关推荐
Knuth-Morris-Pratt algorithm
通过运行"KMP Algorithm.cpp"程序,我们可以验证算法的正确性并观察其在不同输入下的性能表现。 KMP算法的优点在于避免了不必要的回溯,提高了字符串匹配的效率,时间复杂度为O(n + m),其中n是主串长度,m是子串...
KMPAlgorithm.c
字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”...许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。
std::string text = "Hello, I am learning about the KMP algorithm."; std::string pattern = "KMP"; KMP(text, pattern); return 0; } ``` 在这个例子中,`computeLPS`函数用于生成部分匹配表,`KMP`函数...
char text[] = "Hello, I am learning KMP algorithm."; char pattern[] = "learning"; int* table = buildPartialMatchTable(pattern); int index = kmpMatch(text, pattern, table); if (index != -1) { ...
KMP kmp算法 kmp算法 kmp算法 kmp算法 kmp算法
this is a test for the KMP algorithm." pattern = "KMP" index = kmp_search(text, pattern) if index != -1: print(f"Pattern found at index {index}") else: print("Pattern not found") ``` 在这个Python...
text = "hello world, this is a test string for KMP algorithm." pattern = "KMP" matches = kmp_search(text, pattern) print(f"Pattern '{pattern}' matches at positions: {matches}") ``` 在这个例子中,`get...
在"KMP-algorithm-master"项目中,可能包含了KMP算法的实现代码,这为学习和理解KMP算法提供了直观的实例。通过阅读和理解这些代码,开发者可以更好地掌握KMP算法的工作原理,并将其应用于实际问题中。此外,该项目...
《深入理解KMP算法》 KMP算法,全称为Knuth-Morris-Pratt算法,是字符串匹配领域中的一种高效算法,由Don Knuth、Vernon Morris和James H. Pratt三位学者在1970年代提出。这个算法主要用于在一个主串(文本串)中...
The classical KMP algorithm for string matching (the target string can be modified in the main function, if any match is found, the matching position would be returned)
...The number of questions is increasing recently. Here is the classification of all `468` questions. ...I'll keep updating for full summary and better solutions....|-----|---------------- | --------------- |...
《KMP算法在字符串匹配中的应用》 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Don Knuth、Vaughan Pratt和James H. Morris三位学者于1977年提出。它主要解决了在一个主串(text)中查找一个模式...
10. **KMP模式匹配**(KMP Algorithm):不是排序算法,而是一种字符串搜索算法,能够在给定文本中高效地查找特定模式。 这些C语言实现的排序算法提供了学习和理解排序原理的机会,同时也可以看到如何通过优化提高...
- **字符串匹配(KMP Algorithm)**:Knuth-Morris-Pratt算法,用于高效字符串匹配。 - **全排列和全组合**:列举所有可能的排列或组合方式。 这些算法和数据结构构成了ACM竞赛和高级编程挑战的核心,掌握它们是...
char text[] = "hello world, I am learning KMP algorithm"; char pattern[] = "KMP"; int* table = getPartialMatchTable(pattern, strlen(pattern)); int index = KMP(text, pattern, table); if (index != ...
KMP 算法(Knuth-Morris-Pratt Algorithm)是一种改进的字符串匹配算法,相比 BF 算法具有更高的效率。其主要思想是使用一个辅助数组 next 来记录目标字符串的部分匹配信息,以便快速跳过不匹配的部分。 KMP 算法的...