描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
数据范围:字符串长度1≤length≤300
进阶:时间复杂度:O(n^3) ,空间复杂度:O(n)
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
示例1
输入:
abcdefghijklmnop abcsafjklmnopqrstuvw
输出:
jklmnop
#include<cstdio>
#include <cstring>
#include<vector>
#include<string>
using namespace std;
vector<string> vec;
void find(string str1,string str2)
{
int l1=str1.size(); //较短的字符串
int l2=str2.size();
for(int i=0;i<l1;i++)
{
for(int j=0;j<l2;j++)
{
string temp="";
for(int k=j,t=i;k<l2;k++,t++)
{
if(str1[t]!=str2[k])
{
break;
}
temp.push_back(str1[t]);
}
vec.push_back(temp);
}
}
}
int main()
{
// 1.输入数据
char buf1[400];
char buf2[400];
fgets(buf1,400,stdin);
fgets(buf2,400,stdin);
string str1=buf1;
string str2=buf2;
str1.pop_back();
str2.pop_back();
// 2.查找
int l1=str1.size();
int l2=str2.size();
if(l1<l2)
{
find(str1, str2);
}
else {
find(str2, str1);
}
// 3.找到最长公共子串
string maxstr="";
for(int i=0;i<vec.size();i++)
{
if(maxstr.size()<vec[i].size())
{
maxstr=vec[i];
}
}
// 4.输出
printf("%s\n",maxstr.c_str());
}