用C语言编程实现模式匹配算法,写出完整的函数实现
时间: 2024-11-20 09:37:32 浏览: 20
在C语言中,我们可以使用KMP(Knuth-Morris-Pratt)算法来实现高效的字符串模式匹配。以下是KMP算法的完整函数实现,包括前缀函数的计算和模式匹配过程:
```c
#include <stdio.h>
#include <string.h>
// 计算前缀函数
int* compute_prefix_function(const char* pattern, int m) {
int P[m];
P[0] = 0;
for (int i = 1, j = 0; i < m; ++i) {
while (j > 0 && pattern[i] != pattern[j]) {
j = P[j - 1];
}
if (pattern[i] == pattern[j])
j++;
P[i] = j;
}
// 将前缀函数存入动态分配的数组
int* prefix_ptr = (int*)malloc(sizeof(int) * (m + 1));
memcpy(prefix_ptr, P, sizeof(int) * (m + 1));
return prefix_ptr;
}
// KMP搜索函数
bool kmp_search(const char* text, const char* pattern, int n, int m, int* prefix) {
int i = 0, j = 0;
while (i < n && j < m) {
if (text[i] == pattern[j])
i++, j++;
else if (j > 0)
j = prefix[j - 1];
else
i++;
}
if (j == m) {
printf("Pattern found at index %d\n", i - j);
return true;
} else {
printf("Pattern not found in the text.\n");
free(prefix); // 注意释放内存
return false;
}
}
int main() {
const char* text = "ABABCABAA";
const char* pattern = "ABC";
int m = strlen(pattern);
int* prefix = compute_prefix_function(pattern, m);
kmp_search(text, pattern, strlen(text), m, prefix);
return 0;
}
```
这个程序首先计算出`pattern`的前缀函数,然后在`text`中使用KMP搜索方法查找模式。如果找到匹配,会在控制台输出匹配的位置。请注意,最后别忘了在main函数中释放`prefix`数组的内存。
阅读全文