用C++实现:输入两个字符串,判断第一个字符串中是否能找到第二个字符串,如果可以返回第二个字符串在第一个字符串中出现的位置,如果不能找到,则返回0
时间: 2024-03-09 19:46:04 浏览: 65
好的,以下是用 C++ 实现 KMP 算法来解决字符串匹配问题的代码:
```c++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 计算模式串的部分匹配表
vector<int> compute_prefix_function(const string& pattern) {
int m = pattern.size();
vector<int> next(m);
next[0] = -1;
int k = -1;
for (int q = 1; q < m; ++q) {
while (k >= 0 && pattern[k+1] != pattern[q]) {
k = next[k];
}
if (pattern[k+1] == pattern[q]) {
++k;
}
next[q] = k;
}
return next;
}
// 在目标串中查找模式串
int KMP(const string& text, const string& pattern) {
int n = text.size();
int m = pattern.size();
vector<int> next = compute_prefix_function(pattern);
int j = -1;
for (int i = 0; i < n; ++i) {
while (j >= 0 && text[i] != pattern[j+1]) {
j = next[j];
}
if (text[i] == pattern[j+1]) {
++j;
}
if (j == m - 1) {
return i - j;
}
}
return 0;
}
int main() {
string text, pattern;
cin >> text >> pattern;
int pos = KMP(text, pattern);
if (pos > 0) {
cout << pos << endl;
} else {
cout << 0 << endl;
}
return 0;
}
```
以上代码中,`compute_prefix_function` 函数和 `KMP` 函数分别实现了 KMP 算法的两个核心步骤:计算部分匹配表和在目标串中查找模式串。在 `main` 函数中,我们读入了两个字符串,并调用 `KMP` 函数来查找模式串在目标串中的位置。如果找到了模式串,则输出其在目标串中的位置,否则输出 `0`。
阅读全文