题目:
解答:
解法中,运用了kmp算法的思想,即无须再次判断最大公共前缀中的字符子串。
#include <stdio.h>
#include <string.h>
//重合总长为s2的长度len2时,将s1中的子串全部置为000……
void delete(char *s1,int i,int j){
for(;j>0;i--){
if(s1[i]!='0'){
s1[i]='0';
j--;
}
}
}
int main(){
char s1[81],s2[81];
int len1,len2,i,j,flag;
gets(s1);
gets(s2);
len1=strlen(s1);
len2=strlen(s2);
//在s1中发现s2就将对应的子串置为00……
while(1){
flag=-1;
for(i=0,j=0;i<len1;i++){
//发现‘0’直接略过
if(s1[i]=='0'){
continue;
}
//s1中对应字符与s2中相等,则重合长度j+1;如果不相等了,就将重合长度置为0;
if(s1[i]==s2[j]){
j++;
//重合总长为s2的长度len2时,将s1中的子串全部置为000……
if(j==len2){
flag=1;
delete(s1,i,j);
j=0;
}
}else{
j=s1[i]==s2[0]?1:0;
}
}
//flag==-1,说明当前一趟循环没有删除子串,即完成删除s1中的所有s2
if(flag==-1){
break;
}
}
for(i=0;i<len1;i++){
if(s1[i]!='0'){
printf("%c",s1[i]);
}
}
return 0;
}