假设在文本”ababcabccabccacbab”中查找模式“abccac”,分别写出采用BF算法和KMP算法的串匹配过程。C++
时间: 2024-10-24 15:15:03 浏览: 44
算法分析与设计复习大纲.pdf
在C++中,我们首先了解一下BFS(Boyer-Moore Hunt)算法和KMP(Knuth-Morris-Pratt)算法的基本思想:
**BFS(Boyer-Moore Hunt)算法:**
这是一种基于坏字符规则和好后缀规则的搜索算法。在查找过程中,每次移动字符串T(模式)时,先根据坏字符规则避开已知无法匹配的字符,然后使用好后缀规则尽可能地继续匹配。
**KMP算法:**
KMP算法是一种利用了模式串自身信息避免回溯的算法,通过构建部分匹配表(Partial Match Table, PMT)提前预处理模式串,使得匹配失败时能快速跳跃到下一个可能的位置,而不是每次都从头开始检查。
以下是使用这两种算法在给定文本中查找特定模式的简单示例:
**BFS算法:**
```cpp
#include <string>
#include <vector>
bool BM_search(const string& text, const string& pattern) {
size_t pos = 0;
for (size_t i = 0; i < text.size(); ++i) {
if (text[i] == pattern[pos]) {
if (pos == pattern.size()) return true; // 找到了匹配
++pos;
} else {
if (pos > 0) pos = bad_char_rule(text, i, pattern, pos); // 使用坏字符规则回退
else break;
}
}
return false;
}
// 坏字符规则的具体实现(这里简化,实际需要更复杂)
size_t bad_char_rule(const string& text, size_t text_pos, const string& pattern, size_t pattern_pos) {
while (pattern_pos > 0 && text[text_pos] != pattern[pattern_pos - 1])
pattern_pos = max(pattern_pos - 1, good_suffix_rule(pattern, pattern_pos)); // 回退到好后缀规则
return pattern_pos;
}
// 好后缀规则的实现略,这里简化
```
**KMP算法:**
```cpp
#include <string>
#include <vector>
void build_PMT(const string& pattern, vector<int>& PMT) {
// PMT构造代码略...
}
bool KMP_search(const string& text, const string& pattern) {
size_t pos = 0, i = 0;
vector<int> PMT(pattern.size());
build_PMT(pattern, PMT);
while (i < text.size()) {
if (text[i] == pattern[pos]) {
if (pos == pattern.size()) return true;
++i, ++pos;
} else if (pos > 0) {
pos = PMT[pos - 1];
} else {
++i;
}
}
return false;
}
```
阅读全文