/*
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
数据范围:字符串长度1\le length \le300 \1≤length≤300
进阶:时间复杂度:O(n^3)\O(n3) ,空间复杂度:O(n)\O(n)
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入:
abcdefghijklmnop abcsafjklmnopqrstuvw
复制输出:
jklmnop
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 310
char out[MAX_LEN] = {0};
void findMaxStr(char *s1, char*s2)
{
int len1 = strlen(s1);
int len2 = strlen(s2);
int cnt = 0;
int maxValue = 0;
for(int i = 0; i < len1; i++){
char tmp[MAX_LEN] = {0};
for(int j = 0; j < len2; j++){
cnt = 0; //
while(s1[i + cnt] == s2[j + cnt]){
tmp[cnt++] = s1[i + cnt];
}
//printf("tmp:%s cnt:%d\n",tmp,cnt);
if(cnt > maxValue){
memset(out,0,sizeof(char) * MAX_LEN);
maxValue = cnt;
strcpy(out,tmp);
//printf("37:%s\n",out);
}
}
}
printf("%s\n",out);
}
int main()
{
char s1[MAX_LEN] = {0};
char s2[MAX_LEN] = {0};
scanf("%s %s",s1, s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
if (len1 > len2) {
findMaxStr(s2,s1);
} else {
findMaxStr(s1,s2);
}
return 0;
}