07-串应用-
题目描述
给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串
本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那
可能需要考虑模式串和替换串长度不一致的情况
输入
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串
以此类推
输出
第一行输出第1个实例的主串
第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。
以此类推
输入样例
3
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc
aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef
#include<iostream>
#include<string>
using namespace std;
class Cstring
{
string str;
int size;
void getnext(string p,int next[]);
int KMPfind(string p,int pos,int next[]);
public:
Cstring();
~Cstring();
void setval(string sp);
int KMPfindsubstr(string p,int pos);
void changestr(int v,string p1,string p);//前面的所有都和前一题一摸一样只是加了个函数
};
void Cstring::getnext(string p,int next[])
{
int j=0,k=-1;
next[0]=-1;
int len=p.length();
while(j<len)
{
if(k==-1||p[j]==p[k])
{
++j;++k;
next[j]=k;
}
else
k=next[k];
}
}
int Cstring::KMPfind(string p,int pos,int next[])
{
int i=pos,j=0;
int len=p.length();
while(i<size&&j<len)
{
if((j==-1)||p[j]==str[i])
{
++i;++j;
}
else
j=next[j];
}
if(j==len)
return i-len+1;
return 0;
}
Cstring::Cstring()
{size=0;str="";}
Cstring::~Cstring()
{size=0;str="";}
void Cstring::setval(string sp)
{
str="";
str.assign(sp);
size=str.length();
}
int Cstring::KMPfindsubstr(string p,int pos)
{
int i;
int len=p.length();
int *next=new int[len];
getnext(p,next);
int v=KMPfind(p,pos,next);
delete []next;
return v;
}
void Cstring::changestr(int v,string p1,string p)//替换!
{
int l=p1.length();
int len=p.length();
int i,j=-1;
if(l!=len)//如果要替换的串和原来位置上的长度不一致
for(i=size-1;i>size-1-len-v;i--)//把位置空出来
str[i+l-len]=str[i];
for(i=v-1;i<v-1+l;i++)//填进去p1
str[i]=p1[j++];
size=size-len+l;
for(i=0;i<size;i++)
cout<<str[i];
cout<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
Cstring str;
string sp,p,p1;
int pos=0;
int v;
cin>>sp>>p>>p1;
str.setval(sp);
cout<<sp<<endl;
v=str.KMPfindsubstr(p,pos);
if(v==0)
cout<<sp<<endl;
else
str.changestr(v,p1,p);
}
return 0;
}