(YTU)问题 G: 字符串的修改(串)

题目描述:
一个字符串s、一个字符串t,判断t是否是s的子串,若是则将s中所有出现了t串的地方换成指定的字符或字符串p(p的字符数可以不和t相同),若不是,则输出NO
输入:
一个字符串s、一个字符串t,要换的字符或字符串
输出:
输出修改后的s串
样例输入:
asdfasdf
132
saf
样例输出:
NO
代码及运行结果如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char s[100],t[100],p[100];
    int i,j=1,k=0,a=0,temp1,temp2,count[50];
    int len1,len2,len3,n=1,m=0,number=1,distance;
    gets(s);//输入母字符串
    gets(t);
    gets(p);
    len1=strlen(s),len2=strlen(t),len3=strlen(p);//求出字符串的长度
    distance=abs(len3-len2);//第二次和第三次输入字符串长度的差值
    for(;j<len1;j++)
    {
        temp1=j;//以下用temp代替j,以保证j的值不变
        for(i=0;i<len2;i++)
        {
            if((s[temp1]==t[number])&&(s[temp1-1]==t[number-1]))//若满足这个条件,计数加一
            {
                n+=1,number+=1,temp1+=1;
            }
            else//只要不满足if,就一定不和字符串t相同
                break;
            if(n==len2)//满足这个条件,说明是子串
            {
                m+=1;//这里自增当作一个判定条件
                count[a]=(temp1-len2);//这个作为字符串s要被替换的数组位置,方便接下来替换
                a+=1;
                j=temp1;//这里赋值,提高程序效率
            }
        }
        number=1,n=1;//重新赋值开始新一轮对照
    }
    for(j=0;j<a;j++)//进行替换字符(len3>len2)的情况
    {
        if(m==0||len3<=len2)//如果If成立,说明t不是s的子串,不用进行替换
            break;
        for(i=len1-1;i>(count[j]+len2-1);i--)
        {
                temp2=i+distance;
                s[temp2]=s[i];
        }
        count[j+1]+=(distance*(j+1));
        len1+=distance;
        for(i=count[j];i<count[j]+len3;i++)//替换操作
        {
            s[i]=p[k];
            k+=1;
        }
        k=0;//注意要重新赋值开始新一轮赋值
    }
	for(j=0;j<a;j++)//进行替换字符//(len2==len3)的情况
    {
        if(m==0||len2!=len3)//如果If成立,说明t不是s的子串,不用进行替换
            break;
        for(i=count[j];i<count[j]+len3;i++)//替换操作
        {
            s[i]=p[k];
            k+=1;
        }
        k=0;//注意要重新赋值开始新一轮赋值
    }
    for(j=0;j<a;j++)//进行替换字符(len3<len2)的情况
    {
        if(m==0||(len3>=len2))//如果If成立,说明t不是s的子串,不用进行替换
            break;
        for(i=count[j]+len2;i<len1-1;i++)
        {
                temp2=i-distance;
                s[temp2]=s[i];
        }
        count[j+1]-=(distance*(j+1));
        len1-=distance;
        for(i=count[j];i<count[j]+len3;i++)//替换操作
        {
            s[i]=p[k];
            k+=1;
        }
        k=0;//注意要重新赋值开始新一轮赋值
    }
    for(i=0;i<len1;i++)
    {
        if(m==0)//如果If成立,说明t不是s的子串,只输出No
        {
            printf("NO\n");
            break;
        }
        printf("%c",s[i]);
    }
    return 0;
}

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值