c++编写完整代码,已知主串S='abc12abcd123efdk1123,子串T=12,使用堆串存储结构。要求使用KMP方法找到S中包含的所有子串T并删除,然后输出删除后的串S。
时间: 2024-11-04 07:11:19 浏览: 25
在C++中,我们可以使用KMP算法结合堆栈来查找并删除所有子串`T`。首先,我们需要准备KMP表,然后遍历主串`S`,对于每个匹配的位置,我们将那个位置及其之后的部分加入到新的字符串中。以下是完整的代码:
```cpp
#include <iostream>
#include <string>
#include <stack>
using namespace std;
// KMP表的构造函数
void computeKMPTable(string pattern, vector<int>& kmpArray) {
int length = pattern.length();
kmpArray[0] = -1;
int j = -1; // 上一匹配字符的位置
for (int i = 1; i < length; i++) {
while (j >= 0 && pattern[j + 1] != pattern[i]) {
j = kmpArray[j];
}
if (pattern[j + 1] == pattern[i]) {
j++;
}
kmpArray[i] = j;
}
}
// 删除子串的辅助函数
string deleteSubstring(string str, string subStr) {
stack<pair<int, size_t>> matches;
int j = 0; // KMP表的索引
for (size_t i = 0; i < str.size(); ++i) {
while (j > 0 && str[i] != subStr[j]) {
j = kmpArray[j - 1];
}
if (str[i] == subStr[j]) {
j++;
}
if (j == subStr.size()) {
matches.push({i, j});
j = kmpArray[j - 1];
}
}
string result = "";
for (size_t i = 0; i < str.size(); ++i) {
if (!matches.empty() && i >= matches.top().first) {
matches.pop();
} else {
result += str[i];
}
}
return result;
}
int main() {
string S = "abc12abcd123efdk1123";
string T = "12";
vector<int> kmpArray;
computeKMPTable(T, kmpArray);
string modifiedS = deleteSubstring(S, T);
cout << "Modified String after deleting all occurrences of '" << T << "': " << modifiedS << endl;
return 0;
}
```
在这个代码中,我们首先计算了`T`的KMP表,然后遍历`S`,利用KMP表找出所有匹配的位置,并将其从`S`中删除。最后,输出删除后的字符串。
阅读全文