一、题目描述
给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串
本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那可能需要考虑模式串和替换串长度不一致的情况
二、输入与输出
1.输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串
以此类推
4
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc
abcdef
abc
c
2.输出
第一行输出第1个实例的主串
第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。
以此类推
aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef
abcdef
cdef
三、参考代码
#include <iostream>
#include <string>
using namespace std;
class Mystr
{
public:
string s;
int* next = new int[s.length()];
Mystr(string str) { s = str;}
};
void GetNext(Mystr* str)
{
int i = 0;
int j = -1;
str->next[0] = -1;
while (i < str->s.length())
{
if (j == -1 || str->s[i] == str->s[j])
{
i++;
j++;
str->next[i] = j;
}
else
{
j = str->next[j];
}
}
}
int FindKMP(Mystr* str1, Mystr* str2)
{
int i = 0;
int j = 0;
int len1 = str1->s.length();
int len2 = str2->s.length();
GetNext(str2);
while (i < len1 && j <len2)
{
if (j == -1 || str1->s[i] == str2->s[j])
{
i++;
j++;
}
else
{
j = str2->next[j];
}
}
if (j == len2)
{
return i - j;
}
else
{
return -1;
}
}
int main(void)
{
int sum;
cin >> sum;
while (sum--)
{
string str, s1, s2;
cin >> str >> s1 >> s2;
Mystr s(str);
Mystr ss(s1);
/*GetNext(&ss);
for (int i = 0; i < ss.s.length(); i++) {
cout << ss.next[i];
}
cout << endl;*/
int flag = FindKMP(&s, &ss);
//cout << flag<<endl;
cout << str << endl;
if (flag != -1)
{
int len = s1.length();
s.s.replace(flag,len,s2);
cout << s.s << endl;
}
else
{
cout << s.s << endl;
}
}
return 0;
}
/**********************************************************************
Problem: 1072
Language: C++
Result: AC
Time:5 ms
Memory:2224 kb
**********************************************************************/