第1个回答 2011-06-23
#include<stdio.h>
#include<string.h>
char str_host[100];//主串
char str_x[100];//字符串X
char str_y[100];//字符串Y
char str_z[100];//字符串Z
void subpos(char *str_host,char *str_z,int *pos)
{//求串Z在主串中的所有位置,记录在pos[]数组中
//pos[0]用来记录,位置的个数;从pos[1]开始记录位置
int i,j;
int len_host,len_z;//表示长度
len_host=strlen(str_host);
len_z=strlen(str_z);
for(i=0;i<=len_host-len_z;i++)
{//对主串中,每个位置开始匹配,看能否构成子串
for(j=0;j<len_z;j++)
{
if(str_host[i+j]!=str_z[j])
break;
}
if(j==len_z)
{
pos[0]++;
pos[pos[0]]=i+1;
}
}
}
void subxy(char *str_x,char *str_y,char *str_sub_xy)
{//对X中的所有子串,按长度从长到短,判断是否同时是Y的子串;
//取长度最长的子串,为题目要求
//str_sub_xy记录公共子串
int len_x,len_y,len,curlen;
int i,j,k;
len_x=strlen(str_x);
len_y=strlen(str_y);
len=len_x>len_y?len_x:len_y;//len为x,y中短串的长度;
curlen=len;//表示当前用于匹配的子串长度;
while(curlen--)
{
for(i=0;i+curlen<=len_x;i++)
{//按长度,从长到短,取子串
for(j=i;j<i+curlen;j++)
str_sub_xy[j-i]=str_x[j];
str_sub_xy[j-i]='\0';
if(strstr(str_y,str_sub_xy)!=NULL)
{//如果该子串同时是Y子串
curlen=-1;//用于退出while
break;
}
}
}
if(curlen==-1)
{//则表明没找到匹配子串
str_sub_xy[0]='\0';
}
}
void replace(char *str_host,char *str_rep,int len,int *pos)
{//len表示转换的子串长度,即Z串长度;
int i,j,num;//num表示要转换的个数,即pos[0]
int len_host,len_rep;
len_host=strlen(str_host);
len_rep=strlen(str_rep);
num=pos[0];
for(i=0;i<num;i++)
{
for(j=pos[i]-1;j<len_rep;j++)
{
str_host[j]=str_rep[j-(pos[i]-1)];
}
}
}
void main()
{
int pos[100];//Z在主串中位置
char str_sub_xy[100];//公共子串
char str_rep[100];//用于转换Z的子串,其实际长度应该与Z同;
int len;
memset(pos,0,100*sizeof(int));//初始化为0
scanf("%s%s%s%s%s",str_host,str_x,str_y,str_z,str_rep);
len=strlen(str_z);
subpos(str_host,str_z,pos);
subxy(str_x,str_y,str_sub_xy);
replace(str_host,str_rep,len,pos);
}