兰州大学上机题——字符串匹配并删除子字符串
题目描述:
输入一个字符串,例如asdfghj,然后又给了一个字符串,sdfg,要求将输入字符串中的sdfg删除,就是相当于删除子字符串。
算法思路:
先找到子字符串的位置,再进行删除操作,字符串匹配这里用BF算法解决。删除操作这里是先把子字符串后面的元素往前移动替换子字符串的元素,然后删除剩下多余的元素。
#include<iostream>
#include<string>
using namespace std;
//暴力法解决字符串匹配
int BF(string str1, string str2) {
int len1 = str1.length();
int len2 = str2.length();
//如果子字符串的长度大于字符串长度,一定不匹配
if (len1 < len2)
return -1;
int i = 0, j = 0;
while (i < len1 && j < len2) {
if (str1[i] == str2[j]) {
i++;
j++;
}
else {
i = i - j + 1;
j = 0;
}
}
if (j >= len2) {
return i - len2;
}
else
return -1;
}
//删除子字符串
void delet(string str1, string str2) {
int start = BF(str1, str2);
//如果字符串不匹配直接跳出
if (start < 0) {
cout << "字符串不匹配" << endl;
return;
}
int len1 = str1.length();
int len2 = str2.length();
//令两个索引,一个指向要删除的元素,一个指向要往前移动的元素
int i = start, j = start + len2;
//把删除位置后面的元素往前移动
while (j < len1) {
str1[i] = str1[j];
i++;
j++;
}
//把后面多余的元素删除
while (i < len1) {
str1[i] = '\0';
i++;
}
cout << str1;
}
int main() {
string str1, str2;
cout << "输入主字符串:";
cin >> str1;
cout << "输入子字符串:";
cin >> str2;
delet(str1, str2);
return 0;
}
运行测试结果: