《编程思维与实践》1046.字串间距
题目
思路
通过字符串的搜索,找到第一次出现的位置和最后一次出现的位置,然后进行分类讨论,最后比较得到最大间距.
第一次出现可以直接调用strstr函数,而最后一次出现需要使用strrstr函数(string.h里不包含),可通过反复调用strstr函数来实现.
找到s1,s2第一次和最后一次出现的位置,两两进行运算有四种可能情况,再讨论s1在前还是s2在前(因为间距必须为正数),
最后比较得到最大间距.
代码
#include<stdio.h>
#include<string.h>
char *strrstr(char *dest,char* src) //dest 目标 src search 搜索
{
if(strstr(dest,src)!=NULL)
{
dest=strstr(dest,src)+strlen(src); //加上长度后从后面开始接着搜
strrstr(dest,src); //反复调用直到找不到字符串
}
else
{
return dest-strlen(src); //返回头指针 所以需要减去长度
}
}
int main()
{
int T;
scanf("%d",&T);
for(int t=0;t<T;t++)
{
char s1[81],s2[81],s[81];
scanf("%s",s1);
scanf("%s",s2);
scanf("%s",s);
printf("case #%d:\n",t);
if(strstr(s,s1)==NULL||strstr(s,s2)==NULL)
{
printf("0\n");
}
else
{
int d[4];
d[0]=strstr(s,s1)-strstr(s,s2)>0?strstr(s,s1)-strstr(s,s2)-strlen(s2):strstr(s,s2)-strstr(s,s1)-strlen(s1); //>0表明s2在前,需要减掉s2长度
d[1]=strrstr(s,s1)-strstr(s,s2)>0?strrstr(s,s1)-strstr(s,s2)-strlen(s2):strstr(s,s2)-strrstr(s,s1)-strlen(s1);
d[2]=strstr(s,s1)-strrstr(s,s2)>0?strstr(s,s1)-strrstr(s,s2)-strlen(s2):strrstr(s,s2)-strstr(s,s1)-strlen(s1);
d[3]=strrstr(s,s1)-strrstr(s,s2)>0?strrstr(s,s1)-strrstr(s,s2)-strlen(s2):strrstr(s,s2)-strrstr(s,s1)-strlen(s1);;
int maxdistance=0; //最远距离
for(int i=0;i<4;i++)
{
if(d[i]>maxdistance)
{
maxdistance=d[i];
}
}
printf("%d\n",maxdistance);
}
}
return 0;
}