C++设计匹配算法,实现下面字符串的匹配。若匹配成功,返回匹配成功的序号,若匹配失败,返回失败信息。 text = "我家门前有两棵树,一棵是枣树,还有一棵也是枣树" pattern = "枣树"
时间: 2024-09-21 07:02:12 浏览: 26
在C++中,你可以使用KMP算法(Knuth-Morris-Pratt算法)来高效地实现模式串(pattern)在文本串(text)中的匹配。这个算法是一种避免回溯的技术,通过预处理模式串构建一个部分匹配表(失配函数),能够在遇到无效字符时直接跳过一些位置,提高搜索效率。
以下是基本步骤:
1. 首先,计算模式串`pattern`的失配函数(最长公共前后缀长度数组)。失配函数k[i]表示模式串前i个字符中,最多能匹配到的前面已经匹配过的字符数。
2. 然后,在文本串`text`上从头开始遍历,每次比较当前字符和模式串的下一个字符,如果相等,则继续向后移动;如果不等,查看失配函数,找到模式串当前位置`j`使得`pattern[j] == text[current_index - k[j]]`,然后将`current_index`设置为`j + 1`,继续比较。如果没有这样的`j`,则模式不匹配,记录下失败的位置,并尝试在下一个有效位置继续。
3. 如果整个模式串都匹配完了,说明找到了匹配成功的地方,返回起始位置;如果没有完全匹配,说明匹配失败,可以返回最后找到的有效位置后的失败信息(通常是一个提示,如“Pattern not found”)。
下面是一个简单的C++代码示例:
```cpp
#include <vector>
#include <string>
int getMatchIndex(const std::string& text, const std::string& pattern) {
int n = text.size();
int m = pattern.size();
// 计算失配函数
std::vector<int> lps(m);
int j = 0;
for (int i = 1; i < m; ++i) {
while (j > 0 && pattern[i] != pattern[j]) {
j = lps[j - 1];
}
if (pattern[i] == pattern[j]) {
++j;
}
lps[i] = j;
}
// KMP匹配
int current_index = 0;
for (int i = 0; i < n; ++i) {
while (current_index > 0 && text[i] != pattern[current_index]) {
current_index = lps[current_index - 1];
}
if (text[i] == pattern[current_index]) {
++current_index;
}
if (current_index == m) {
return i - m + 1;
}
}
// 匹配失败
return -1; // 或者返回一个特定的失败提示消息
}
// 使用示例
std::string text = "我家门前有两棵树,一棵是枣树,还有一棵也是枣树";
std::string pattern = "枣树";
int index = getMatchIndex(text, pattern);
if (index != -1) {
std::cout << "匹配成功,序号: " << index << std::endl;
} else {
std::cout << "匹配失败" << std::endl;
}
```