描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
数据范围:字符串长度1≤length≤300
进阶:时间复杂度:O(n^3) ,空间复杂度:O(n)
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入:
abcdefghijklmnop abcsafjklmnopqrstuvw
输出:
jklmnop
解题思路:
这道题直接暴力求解了。
首先把短字符串和长字符串进行了区分,这有利于后面解题
由于要找最长的公共子串,所以我从最长的子串长度开始遍历查找,即短字符串的长度,如若短字符串与长字符串的所有子串并不相同,则将子串长度减1,遍历短字符串和长字符串在这个长度下的子串,如果相同就可以break,这个就是最先出现的最长公共子串。如果这个长度下仍然没有公共子串,则将子串长度再减1,继续查找。
代码如下:
#include <stdio.h>
#include <string.h>
#define N 300
int main()
{
char str1[N],str2[N],son1[N],son2[N];
scanf("%s%s",str1,str2);
int len1=strlen(str1),len2=strlen(str2),i=0,j,k,t,u,flag=0;
if(len1>len2) //统一str1是短字符串,str2是长字符串
{
strcpy(son1,str1);
strcpy(str1,str2);
strcpy(str2,son1);
j=len1;len1=len2;len2=j;
}
while(len1-i>0) //从最长子串的长度开始查找
{
for(j=0;j<=i;j++) //短串中子串开始的位置
{
t=0;
for(k=j;k<j+len1-i;k++)
{
son1[t++]=str1[k];
}
son1[t]='\0';
for(k=0;k<=i+len2-len1;k++) //长串中子串开始的位置
{
t=0;
for(u=k;u<k+len1-i;u++)
{
son2[t++]=str2[u];
}
son2[t]='\0';
if(!strcmp(son1,son2)) //出现相同子串
{
flag=1;
break;
}
}
if(flag)
break;
}
if(flag)
break;
i++;
}
printf("%s\n",son1);
return 0;
}