从网上down的例子,现在简要分析下。复杂度比较高,还是挺巧妙的。本人也没有想到更好的解决方法:
1.用到了strstr函数,该函数再string.h头文件中有定义,竟然之前没有见过。哎。。该函数char *strstr(char *str1, char *str2)的意思就是从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。
2.先从相对短的串shortstring开始,与长的串longstring进行整理比较,看是否是其完整子串。
3.如果不是,控制循环i,j,其中 i 变量控制了比较子串个数逐渐减小,j 控制一定个数前提下,各种串的不同可能。这样从length-1到1个字符,各种子串的可能均已列出。
4.在列出的子串中与较长子串进行比较。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *commanstring(char shortstring[], char longstring[])
{
int i, j;
char *substring=(char *)malloc(256);
if(strstr(longstring, shortstring)!=NULL) //如果shortstring是longstring的子串,那么返回shortstring
return shortstring;
for(i=strlen(shortstring)-1;i>0; i--) //否则,开始循环比较
{
for(j=0; j<=strlen(shortstring)-i; j++)
{
memcpy(substring, &shortstring[j], i);
substring[i]='\0';
if(strstr(longstring, substring)!=NULL)
return substring;
}
}
return NULL;
}
void main()
{
char *str1=(char *)malloc(256);
char *str2=(char *)malloc(256);
char *comman=NULL;
gets(str1);
gets(str2);
if(strlen(str1)>strlen(str2)) //将短的字符串放前面
comman=commanstring(str2, str1);
else
comman=commanstring(str1, str2);
printf("the longest comman string is: %s\n", comman);
system("pause");
}