#include <iostream>
#include <vector>
#include <string>
// 构建模式串的前缀表
std::vector<int> buildPrefixTable(const std::string& pattern) {
int n = pattern.length();
std::vector<int> prefixTable(n, 0);
int len = 0;
int i = 1;
while (i < n) {
if (pattern[i] == pattern[len]) {
len++;
prefixTable[i] = len;
i++;
}
else {
if (len != 0) {
len = prefixTable[len - 1];
}
else {
prefixTable[i] = 0;
i++;
}
}
}
return prefixTable;
}
// 使用KMP算法进行字符串匹配
std::vector<int> KMP(const std::string& text, const std::string& pattern) {
std::vector<int> result;
int m = text.length();
int n = pattern.length();
std::vector<int> prefixTable = buildPrefixTable(pattern);
int i = 0; // 主串的指针
int j = 0; // 模式串的指针
while (i < m) {
if (pattern[j] == text[i]) {
i++;
j++;
}
if (j == n) {
result.push_back(i - j);
j = prefixTable[j - 1];
}
else if (i < m && pattern[j] != text[i]) {
if (j != 0) {
j = prefixTable[j - 1];
}
else {
i++;
}
}
}
return result;
}
int main() {
std::string text = "ABABDABACDABABCABAB";
std::string pattern = "ABABCABAB";
std::vector<int> result = KMP(text, pattern);
if (result.empty()) {
std::cout << "模式串在主串中没有出现" << std::endl;
}
else {
std::cout << "模式串在主串中出现的位置:" << std::endl;
for (int i : result) {
std::cout << i << " ";
}
std::cout << std::endl;
}
return 0;
}
KMP-字符串匹配
最新推荐文章于 2024-10-01 05:07:35 发布