题目描述:
一个字符串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;
}
运行结果: