删除子串
编写算法,从串s中删除所有和串t相同的子串。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在第一行中输入不超过80个字符的字符串s,在第二行中输入不超过80个字符的字符串t,s和t中允许包含空格。
输出格式:
对于每组测试,输出在串s中删除所有和串t相同的子串后的结果串。
输入样例:
AABBBBCCDDEEBB
BB
输出样例:
AACCDDEE
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
解题代码
#include<bits/stdc++.h>
using namespace std;
int nexts[85]={0};
void getNext(string str)
{
for(int i=0;i<85;i++){
nexts[i]=0;
}
nexts[0]=-1;
int len = str.size();
int j=-1;
int i=0;
while(i<len){
if(j==-1||nexts[j]==nexts[i]){
j++;
i++;
nexts[i]=j;
}else{
j=nexts[j];
}
}
}
string getAns(string a,string b)
{
int lena=a.size();
int lenb = b.size();
int i=0,j=0;
while(i<lena&&j<lenb){
if(j==-1||a[i]==b[j]){
j++;
i++;
}else{
j=nexts[j];
}
}
if(j==lenb){
a.erase(i-j,lenb);
return getAns(a,b);
}else{
return a;
}
}
int main()
{
string a,b;
while(getline(cin,a)&&getline(cin,b)){
getNext(b);
cout<<getAns(a,b)<<endl;
}
}
解题思路
我用的时kmp算法去找,然后找到一次删一次然后继续递归,直到所有的删完。简单的