6-4 让我们的IDE智能起来

题目描述

小Z一直苦于自己使用的IDE不够智能,没法帮他写代码(划掉)帮他纠正代码中的错误。于是他打算自行实现一个智能的IDE,现在请你完成其中一个功能:给你指定的起始字符串begin和终止字符串end,请你在文本串text中将每一对begin和end之间(不含自身)的字符全部替换为目标串aimbegin和end的 配对原则为:最左侧的begin与其右侧最近的end优先生效 ,之后寻找其右侧下一个begin继续应用此规则。每个begin或end 只能就近生效一次 。

输入格式

输入共两行,第一行为文本串text(len<10^6)。

第二行为三个字符串,使用空格分隔,分别为begin、endaim,均有len<100

输出格式

一行一个字符串,text按规则替换后的结果。

输入样例

在这里给出一组输入。例如:

aaabvvbbesesbbaabbz
aa bb 123

输出样例 

在这里给出相应的输出。例如:

aa123bbesesbbaa123bbz 

思路:

1.首先寻找begin字符串

2.找到begin字符串后,去寻找end字符串

3.如果找到end字符串,做上标记1,用于待会进行字符替换

   如果没有找到end字符串,做上标记0,进行另一种替换

4.替换完之后,将主循环变量,从替换掉的字符长度之后,开始循环

替换思路:

1.没有找到end字符,将后面每一项都存到text2中

2.找到end字符,加begin,aim,end依次存放入text2中

代码: 

#include<stdio.h>
int main()
{
    char text[100000],text2[100000];//定义两个数组,一个存放输入的字符串,一个存放变化后的字符串
    char begin[100],end[100],aim[100];//第二行为三个字符串,使用空格分隔,分别为begin、end及aim
    gets(text);//获取字符串
    scanf("%s %s %s",begin,end,aim);//分别输入begin、end及aim字符串
    int len=strlen(text);//定义各个字符串长度
    int len1=strlen(begin);
    int len2=strlen(end);
    int len3=strlen(aim);
    int i,j,k,p;//定义四个循环变量
    int x=0;//定义一个变量,放入text2中累加,用于储存字符
    for(i=0; i<len; i++)
    {
        int flag=1;//定义一个标志,判断进行哪种字符替换
        int n1=0;//定义一个长度变量,初始值为0
        if(text[i]==begin[0])//如果发现字符串中有一个字符和begin[0]相等
        {
            for(j=0; j<len1; j++)//则进行循环判断是否为begin字符串
            {
                if(text[i+j]==begin[j])//如果此后每一位相同,则n1加一
                {
                    n1++;
                }
            }
            if(n1==len1)//如果n1和begin字符串一样长,则说明是begin字符串
            {
                for(k=i+j; k<len; k++)//接下来去寻找end字符串
                {
                    int n2=0;//定义一个长度变量,初始值为0
                    if(text[k]==end[0])//如果发现字符串中有一个字符和end[0]相等
                    {
                        for(p=0; p<len2; p++)//则进行循环判断是否为end字符串
                        {
                            if(text[k+p]==end[p])
                            {
                                n2++;
                            }
                        }
                        if(n2==len2)//如果n2和end字符串一样长,则说明是end字符串
                        {
                            flag=0;//此时begin和end字符串都已经找到,标志变量变成1
                            break;//需要结束当前循环,前往替换字符
                        }
                    }
                }
            }
        }
        if(flag==1)//如果没有找到end字符串,则将后面所有字符存到text2中
        {
            text2[x++]=text[i];
        }
        if(flag==0)//如果找到begin和end字符串,则将begin,aim,end存到字符串text2中
        {
            for(i=0; i<len1; i++)
            {
                text2[x++]=begin[i];
            }
            for(i=0; i<len3; i++)
            {
                text2[x++]=aim[i];
            }
            for(i=0; i<len2; i++)
            {
                text2[x++]=end[i];
            }
            i=k+p-1;//当存完后,下一次循环从k+p-1开始,继续寻找begin字符串
        }
    }
    printf("%s",text2);
    return 0;
}

 

代码: 

#include<stdio.h>
int main()
{
    char text[100000],text2[100000];
    char begin[100],end[100],aim[100];
    gets(text);
    scanf("%s %s %s",begin,end,aim);
    int len=strlen(text);
    int len1=strlen(begin);
    int len2=strlen(end);
    int len3=strlen(aim);
    int i,j,k,p;
    int x=0;
    for(i=0; i<len; i++)
    {
        int flag=1;
        int n1=0;
        if(text[i]==begin[0])
        {
            for(j=0; j<len1; j++)
            {
                if(text[i+j]==begin[j])
                {
                    n1++;
                }
            }
            if(n1==len1)
            {
                for(k=i+j; k<len; k++)
                {
                    int n2=0;
                    if(text[k]==end[0])
                    {
                        for(p=0; p<len2; p++)
                        {
                            if(text[k+p]==end[p])
                            {
                                n2++;
                            }
                        }
                        if(n2==len2)
                        {
                            flag=0;
                            break;
                        }
                    }
                }
            }
        }
        if(flag==1)
        {
            text2[x++]=text[i];
        }
        if(flag==0)
        {
            for(i=0; i<len1; i++)
            {
                text2[x++]=begin[i];
            }
            for(i=0; i<len3; i++)
            {
                text2[x++]=aim[i];
            }
            for(i=0; i<len2; i++)
            {
                text2[x++]=end[i];
            }
            i=k+p-1;
        }
    }
    printf("%s",text2);
    return 0;
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值