7-29 删除字符串中的子串 (20 分)
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
简单模式匹配BF算法,缺点产生大量回溯,没有利用已经匹配的结果,本题采用暴力求解可AC
#include<stdio.h>
#include<string.h>
int main(){
char a[81];
char b[81];
char c[81];
int lena,lenb;
int i,j,k,m=0,flag;
gets(a);
gets(b);
lena=strlen(a);
lenb = strlen(b);
for(i=0;i<lena;i++){
flag=1;
for(j=0;j<lenb;j++){
if(a[i+j]!=b[j]){
flag=0;
break;
}
}
if(flag){ //出现匹配字符串
for(k=i;k<lena-lenb;k++){
a[k]=a[k+j];
}
lena-=lenb;
i=-1;
}
}
for(i=0;i<lena;i++){
printf("%c",a[i]);
}
}
改进,使用KMP算法, 求next数组
代码实现有时间会补上