作者:yangchang78179 | 来源:互联网 | 2024-12-08 11:39
在文本处理领域,高效的字符串匹配算法至关重要。KMP(Knuth-Morris-Pratt)算法因其高效性而被广泛应用于各种场景中。本文将通过一个具体的C++程序示例,展示如何实现KMP算法来解决字符串匹配问题。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
using namespace std;
#define BUF_SIZE 256
int match_count = 0;
int positions[200] = { 0 };
struct StringSequence {
char str[100];
int len;
};
void computeNextArray(StringSequence pattern, int next[]) {
int i = 0, j = -1;
next[i] = j;
while (i if (j == -1 || pattern.str[i] == pattern.str[j]) {
next[++i] = ++j;
} else {
j = next[j];
}
}
}
int kmpSearch(StringSequence text, StringSequence pattern, int next[]) {
int i = 0, j = 0;
while (i if (j == -1 || text.str[i] == pattern.str[j]) {
i++; j++;
} else {
j = next[j];
}
}
if (j == pattern.len) {
positions[match_count++] = i - j;
return i - j;
}
return -1;
}
int main() {
StringSequence text, pattern;
int next[50];
DWORD bytesRead;
char buffer[BUF_SIZE] = "";
HANDLE fileHandle = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (fileHandle == INVALID_HANDLE_VALUE) {
printf("Error opening file: %d", GetLastError());
return -1;
}
ReadFile(fileHandle, buffer, BUF_SIZE, &bytesRead, NULL);
strcpy(text.str, buffer);
text.len = strlen(text.str);
cout <<"Text: " < cout <<"Enter the pattern to search: ";
cin >> pattern.str;
pattern.len = strlen(pattern.str);
computeNextArray(pattern, next);
kmpSearch(text, pattern, next);
cout <<"Pattern found at positions: ";
for (int i = 0; i cout < }
cout < CloseHandle(fileHandle);
return 0;
}
上述代码首先定义了一个结构体`StringSequence`用于存储字符串及其长度。`computeNextArray`函数计算模式串的部分匹配表(即next数组),这是KMP算法的核心部分之一。`kmpSearch`函数实现了KMP搜索过程,通过比较文本串和模式串来查找所有匹配位置。最后,`main`函数读取文件中的文本作为待搜索的文本串,并从用户输入获取模式串,调用相关函数完成匹配并输出结果。