7-29 | 删除字符串中的子串

题目:


解答:

解法中,运用了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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值