标签:主串 string 05 int 08 nextt 2021 KMP 替换
B : DS串应用–串替换
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 23 Solved: 17
Description
给出主串、模式串、替换串,用KMP算法找出模式串在主串的位置,然后用替换串的字符替换掉模式串
本题只考虑一处替换的情况,如果你想做的完美一些,能够实现多处替换那可能需要考虑模式串和替换串长度不一致的情况
Input
第一个输入t,表示有t个实例
第二行输入第1个实例的主串,第三行输入第1个实例的模式串,第四行输入第1个实例的替换串
以此类推
Output
第一行输出第1个实例的主串
第二行输出第1个实例的主串替换后结果,如果没有发生替换就输出主串原来的内容。
以此类推
Sample Input
4
aabbccdd
bb
ff
aaabbbccc
ddd
eee
abcdef
abc
ccccc
abcdef
abc
cSample Output
aabbccdd
aaffccdd
aaabbbccc
aaabbbccc
abcdef
cccccdef
abcdef
cdef
解题思路:KMP的具有高效字符串匹配优势。
在这里编写出KMP模板后,用KMP查找字符串b在a中位置,查找到后用string 的内置函数erase(位置,删除个数)来删掉,
然后用insert(位置,字符串)插入进去。
ac代码如下:
#include<iostream>
using namespace std;
int nextt[1000000];
void Get_next(string a)
{
int i=0,k=-1;
int len=a.length();
nextt[0]=-1;
while(i<len)
{
if(k==-1||a[i]==a[k])
{
i++,k++;
nextt[i]=k;
}
else k=nextt[k];
}
}
int KMP(string a,string b)
{
int i=0,j=0;
int len=a.length(),len1=b.length();
Get_next(b);
while(i<len&&j<len1)
{
if(j==-1||a[i]==b[j])i++,j++;
else j=nextt[j];
}
if(j==len1)return i-j;
else return -1;
}
int main()
{
string a,b,c;
int n;
cin>>n;
while(n--)
{
cin>>a>>b>>c;
cout<<a<<endl;
int m=KMP(a,b);
if(m!=-1)
{
a.erase(m,b.length());
a.insert(m,c);
}
cout<<a<<endl;
}
return 0;
}
标签:主串,string,05,int,08,nextt,2021,KMP,替换
来源: https://blog.csdn.net/qq_51116518/article/details/119421914
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。