用于在一个文本字符串中查找一个模式字符串的所有出现位置。 编写一个函数KMPSearch(string text, string pattern)
时间: 2024-10-08 12:06:31 浏览: 30
js实现统计字符串中特定字符出现个数的方法
KMP搜索算法是一种高效的字符串匹配算法,它的全称是Knuth-Morris-Pratt算法。它通过预处理模式字符串来避免不必要的字符比较,特别是对于重复出现的字符。该算法的工作原理是利用部分匹配表(也称为失配函数或部分前缀功能数组),这个表记录了模式串之前部分匹配失败时需要跳过的字符数。
KMPSearch 函数的基本步骤如下:
1. 初始化部分匹配表和两个指针,text 和 pattern 的当前指针分别设置为0。
2. 遍历模式字符串(pattern),构造部分匹配表。
3. 使用while循环,当text指针小于pattern指针时:
a. 如果text[pattern[i]] == pattern[i](即当前字符匹配),移动text指针i+1。
b. 否则,检查部分匹配表中的值。如果j > 0 (表示已经遇到过这种情况),说明从text[j]开始尝试匹配;否则,直接跳过pattern[i]。
4. 当找到一个完全匹配时,返回text指针的位置。如果没有找到匹配,则当text遍历完后,返回-1表示未找到。
```cpp
int KMPSearch(string text, string pattern) {
int n = text.size();
int m = pattern.size();
vector<int> lps(m);
// 构建部分匹配表
for (int i = 1, j = 0; i < m; ++i) {
while (j > 0 && pattern[i] != pattern[j]) {
j = lps[j - 1];
}
if (pattern[i] == pattern[j]) {
++j;
}
lps[i] = j;
}
int i = 0, j = 0;
vector<int> indices;
while (i < n) {
if (text[i] == pattern[j]) {
++i;
++j;
} else if (j > 0) {
j = lps[j - 1];
} else {
++i;
}
if (j == m) {
indices.push_back(i - j);
j = lps[j - 1];
}
}
return indices.empty() ? -1 : indices;
}
阅读全文