题目描述
小Z一直苦于自己使用的IDE不够智能,没法帮他写代码(划掉)帮他纠正代码中的错误。于是他打算自行实现一个智能的IDE,现在请你完成其中一个功能:给你指定的起始字符串begin和终止字符串end,请你在文本串text中将每一对begin和end之间(不含自身)的字符全部替换为目标串aim,begin和end的 配对原则为:最左侧的begin与其右侧最近的end优先生效 ,之后寻找其右侧下一个begin继续应用此规则。每个begin或end 只能就近生效一次 。
输入格式
输入共两行,第一行为文本串text(len<10^6)。
第二行为三个字符串,使用空格分隔,分别为begin、end及aim,均有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;
}