#include <stdio.h>
#include <string.h>
int main()
{
char s[400],c[100],t[100];
//存储需要更换的字符组首位
int data[30];
int i,o=0,p,u=0,y,a;
scanf("%s%s%s",s,c,t);
for(i=0;i<strlen(s);)
{
//判断是否存在,若存在,记录在data中
if(s[i]==c[0])
{
for(p=i;p<i+strlen(c);p++)
{
if(s[p]==c[p-i])
{
if(p==i+strlen(c)-1)
{
o=1; //若存在,则令o等于1
data[u] = i;
u++;
}
}
else
break;
}
i+=p-i;
}
else
{
i++;
}
}
//如果不存在,输出NO,结束程序
if(o==0)
{
printf("NO");
return 0;
}
for(i=0;i<u;i++)
{
//如果用来替换的字符串位数大于要替换的字符串,数组后移处理
if(strlen(c)<strlen(t))
{
for(y=strlen(s)+strlen(t)-strlen(c);y>=data[i];y--)
{
s[y] = s[y-(strlen(t)-strlen(c))];
}
for(y=i+1;y<u;y++)
{
data[y]+=strlen(t)-strlen(c);
}
a = strlen(t);
}
else
a = strlen(c);
//令要被替换的位数等于固定值
for(y=data[i];y<data[i]+a;y++)
{
s[y] = -1;
}
o=0;
//替换操作
for(y=data[i];y<data[i]+strlen(t);y++)
{
s[y] = t[o];
o++;
}
}
//输出原字符数组
for(y=0;y<strlen(s);y++)
{
if(s[y]!=-1)
printf("%c",s[y]);
}
return 0;
}
版本二:
#include <stdio.h>
#include <string.h>
int main()
{
char s[1000];
char h[50];
char c[50];
scanf("%s%s%s",s,h,c);
int i,j;
int ok=0;
for(i=0;i<strlen(s);i++)
{
if(ok==1)
break;
for(j=0;j<strlen(h);j++)
{
if(s[i+j]==h[j])
{
if(j==strlen(h)-1)
{
ok=1;
}
}
else
{
if(i==strlen(s)-1)
{
printf("NO");
return 0;
}
else
break;
}
}
}
for(i=0;i<strlen(s);i++)
{
for(j=0;j<strlen(h);j++)
{
if(s[i+j]==h[j])
{
if(j==strlen(h)-1)
{
printf("%s",c);
i+=strlen(h)-1;
}
continue;
}
else
{
printf("%c",s[i]);
break;
}
}
}
return 0;
}
版本二是伪替换,当时为了快速完成OJ,匆忙之下写的。
后来觉得不能这样敷衍了事,又研究了一下这道题,于是有了版本一。
版本一效率是版本二10倍以上,但难理解。
Description
一个字符串s、一个字符串t,判断t是否是s的子串,若是则将s中所有出现了t串的地方换成指定的字符或字符串p,若不是,则输出NO
Input
一个字符串s、一个字符串t,要换的字符或字符串
Output
输出修改后的s串
Sample Input
asdfasdf
132
saf
Sample Output
NO