目录
题目描述
给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串
本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那
可能需要考虑模式串和替换串长度不一致的情况
输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串
以此类推
输出
第一行输出第1个实例的主串
第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。
以此类推
输入样例1
3
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc
输出样例
aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef
思路分析
还是考查KMP算法,先求出next[],用KMP算法找出模式串在主串的位置,然后替换。
1.求next[] ,本题下标从0开始。
next[0]=-1;j=0;k=-1;
while(j<模式串长度-1){
if(k==-1||p[j]==p[k]){
j++;k++;
next[j]=k;
}
else k=next[k];
}
2.KMP算法
j=0;
i=pos;
while(i<主串的长度&&j<子串的长度){
if(j==-1||mainstr[i]==p[j]){
i++;j++;
}
else j=next[j];
}
if(j==子串长度) return i-j;
else return -1;
void replace(int begin,int lenght,string str).从begin位置开始,把长度位lenght的子串替换为str.
AC代码
#include<iostream>
#include<string>
using namespace std;
class myString{
private:
string mainstr;
int size;
void GetNext(string p,int next[]); //算next[];
int KMPFind(string p,int pos,int next[]); //
public:
myString() ;
~myString();
void SetVal(string sp); //设定主串字符内容和长度
int KMPFindSubstr(string p,int pos);
};
void myString :: GetNext(string p,int next[]){ //计算next[]
int j=0,k=-1;
next[0]=-1;
while(j<p.length()-1){
if(k==-1||p[j]==p[k]) {
j++;
k++;
next[j]=k;
}
else k=next[k];
}
}
int myString::KMPFind(string p,int pos,int next[]){
int i=pos;
int j=0;
int L=p.length() ;
while(i<size&&j<L){
if(j==-1||mainstr[i]==p[j]){
i++;
j++;
}
else j=next[j];
}
if(j==p.length()) return i-j;
return -1;
}
myString ::myString ()
{
size=0;
mainstr="";
}
myString ::~myString(){
size=0;
mainstr="";
}
void myString::SetVal(string sp){;
mainstr=sp;
size=mainstr.length();
}
int myString::KMPFindSubstr(string p,int pos){ //从POS位置开始找p,返回位置或-1;
int i=pos;
int L=p.length();
int *next=new int [L];
GetNext(p,next);
int v=-1;
v=KMPFind(p,pos,next);
delete [] next;
return v;
}
int main(){
int t;
cin>>t;
string sp,p,change;
while(t--){
cin>>sp>>p>>change;
myString str;
str.SetVal(sp);
cout<<sp<<endl;
int v=str.KMPFindSubstr(p,0);
int l=p.length();
if(v>=0)
sp.replace(v,l,change);
cout<<sp<<endl;
}
return 0;
}