描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
本题含有多组输入数据!
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入:
abcdefghijklmnop
abcsafjklmnopqrstuvw
输出:
jklmnop
#include <stdio.h>
#include <string.h>
#if 0
#define dbg printf
#else
#define dbg
#endif
int main(void)
{
char str1[1024] = {0};
char str2[1024] = {0};
char longer[1024] = {0};
char shorter[1024] = {0};
char test[1024] = {0};
int len, len1, len2;
int max;
int i;
while(scanf("%s", str1) != EOF)
{
scanf("%s", str2);
len1 = strlen(str1);
len2 = strlen(str2);
if(len1 < len2)
{
len = len1;
strncpy(longer, str2, strlen(str2));
strncpy(shorter, str1, strlen(str1));
}
else
{
len = len2;
strncpy(longer, str1, strlen(str1));
strncpy(shorter, str2, strlen(str2));
}
dbg("(%d):longer=(%s)\n", __LINE__, longer);
dbg("(%d):shorter=(%s)\n", __LINE__, shorter);
max = len;
for(max=len; max>0; max--)
{
for(i=0; i<=len-max; i++)
{
memset(test, 0, sizeof(test));
strncpy(test, shorter+i, max);
dbg("(%d):test=(%s)\n", __LINE__, test);
if(strstr(longer, test) != NULL)
{
goto PRINT;
}
}
}
PRINT:
printf("%s\n", test);
memset(test, 0, sizeof(test));
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
memset(longer, 0, sizeof(str1));
memset(shorter, 0, sizeof(str2));
}
}