题目描述
给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串
本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那可能需要考虑模式串和替换串长度不一致的情况
输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串
以此类推
输入样例:
3
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc
输出
第一行输出第1个实例的主串
第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。
以此类推
输出样例:
aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef
代码
#include <iostream>
using namespace std;
class StrReplace{
public:
string S,T,R;
int *next;
int slen,tlen,rlen;
StrReplace(){
cin >> S >> T >> R;
slen = S.length();
tlen = T.length();
rlen = R.length();
next = new int[tlen+1];
getNext(T,next);
}
void getNext(string T, int *next){
next[0] = -1;
int i = 0, j = -1;
while(i < tlen){
if(j == -1 || T[i] == T[j]) {
i++;
j++;
next[i] = j;
}else{
j = next[j];
}
}
}
int KPM(){
int i = 0, j = 0;
while(i < slen && j < tlen){
if(S[i] == T[j] || j == -1){
i++;
j++;
}else{
j = next[j];
}
if(j >= tlen){
return i-tlen;
}
}
return -1;
}
void toReplace(int loc){
if(loc == -1){
cout << S << endl;
cout << S << endl;
}else{
string res;
int i=0,j=0,k=loc+tlen;
while(i < loc){
res += S[i];
i++;
}
while(j < rlen){
res += R[j];
i++;j++;
}
while(k < slen){
res += S[k];
i++;k++;
}
cout << S << endl;
cout << res << endl;
}
}
};
int main()
{
int t;
cin >> t;
while(t--){
StrReplace key;
int k = key.KPM();
key.toReplace(k);
}
return 0;
}