#include <stdio.h>
#define MAX_LEN 100
int f[MAX_LEN];
// Compute failure function
void compute_failure_function(char* b, int n) {
int t, s;
t = 0;
f[0] = 0;
for (s = 0; s < n -1; s++) {
while (t > 0 && b[s+1] != b[t])
t = f[t-1];
if (b[s+1] == b[t]) {
t++;
f[s+1] = t;
} else {
f[s+1] = 0;
}
}
}
// Match keyword
int match_keyword(char* a, int m, char* b, int n) {
int s, i;
s = 0;
for (i = 0; i <= m-1; i++) {
while (s > 0 && a[i] != b[s])
s = f[s-1];
if (a[i] == b[s])
s++;
if (s == n)
return i;
}
return -1;
}
void info_failure_function(int n) {
int i;
printf("----------------------------\n");
printf("Failure Function \n");
printf("----------------------------\n");
printf("s |");
for (i = 0; i < n; i++)
printf("%3d", i);
printf("\n");
printf("f(s) |");
for (i = 0; i < n; i++)
printf("%3d", f[i]);
printf("\n");
printf("----------------------------\n");
}
void info_matched_keyword(char* a, int n, int end, char*b ) {
if (end < 0) {
printf("NO MATCH\n");
return;
}
printf("%s\n", a);
int i;
int begin;
begin = end -n + 1;
for (i = 0; i < begin; i++)
printf(" ");
for (i = begin; i <= end; i++)
printf("%c", b[i - begin]);
printf("\n");
}
void kmp(char* a, int m, char* b, int n) {
int end;
compute_failure_function(b, n);
info_failure_function(n);
end = match_keyword(a, m, b, n);
info_matched_keyword(a, n, end, b);
}
int main(int argc, const char *argv[]) {
kmp("abababaab", 9, "ababaa", 6);
kmp("abababbaa", 9, "ababaa", 6);
return 0;
}
分享到:
相关推荐
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语言实现的排序算法提供了学习和理解排序原理的机会,同时也可以看到如何通过优化提高...
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 算法的...