最长公共子串_牛客题霸_牛客网
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
数据范围: 1≤∣str1∣,∣str2∣≤50001≤∣str1∣,∣str2∣≤5000
要求: 空间复杂度 O(n2)O(n2),时间复杂度 O(n2)O(n2)
示例1
输入:"1AB2345CD","12345EF"
返回值:"2345"
【解法一】枚举
即就是从i下标之前逐个查找最大公共串,但是无法通过提交,因为对于长串来说会超时
string LCS(string str1, string str2) {
// write code here
if(str1.size()>str2.size())
swap(str1,str2);
int l1 = str1.size();
// vector<int> dp(l1+1, 0);
string res;
for(int i = 0; i <= l1; i++)
{
for(int j = 0; j < i; j++)
{
int len = i-j;
string temp(str1.substr(j, len));
if(str2.find(temp)!=-1 && res.size()<len)
{
res.clear();
res = temp;
}
}
}
return res;
}
【解法二】二维动规
class Solution {
public:
string LCS(string str1, string str2) {
// write code here
vector<vector<int>> dp(str1.size()+1, vector<int> (str2.size()+1, 0));
int max = 0;// 用来记录最大长度
int pos = 0;// 用来记录公共串在str1中的终止位置
for(int i = 1; i <= str1.size(); i++)
{
for(int j = 1; j <= str2.size(); j++)
{
// i、j都从1开始 str1和str2访问i、j下标都要进行-1操作
if(str1[i-1] == str2[j-1])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = 0;
if(dp[i][j] > max)
{
max = dp[i][j];
pos = i-1;
}
}
}
return string(str1.substr(pos-max+1, max));
}
};
【解法三】滚动数组思想优化
class Solution {
public:
string LCS(string str1, string str2) {
// write code here
vector<int> dp(str2.size()+1, 0);
int pos = 0;
int max = 0;
for(int i = 1; i <= str1.size(); i++)
{
// 注意这里需要从后往前更新,因为要使用到之前的值
for(int j = str2.size(); j >= 1; j--)
{
if(str1[i-1] == str2[j-1])
dp[j] = dp[j-1] + 1;
else
dp[j] = 0;
if(dp[j] > max)
{
max = dp[j];
pos = i-1;
}
}
}
return string(str1.substr(pos-max+1, max));
}
};
#include <iostream>
using namespace std;
#include<vector>
int main()
{
string str1,str2;
cin>>str1;
int pos = str1.find(',');
str2 = str1.substr(pos+1);
str1 = str1.substr(0, pos);
int max = 0;
vector<int> dp(str1.size()+1, 0);
for(int i = 1; i <= str1.size(); i++)
{
for(int j = str2.size(); j >= 1; j--)
{
if(str1[i-1] == str2[j-1])
dp[j] = dp[j-1]+1;
else
dp[j] = 0;
if(dp[j] > max)
max = dp[j];
}
}
cout<<max<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")
描述
给定两个字符串,请编写代码,输出最长公共子串(Longest Common Substring),是指两个字符串中的最长的公共子串,要求子串一定是连续。
数据范围:输入的两个字符串长度满足 1≤n≤100 1≤n≤100
输入描述:
文本格式,2个非空字符串(字母数字组成),2个字符串以","英文逗号分割。
输出描述:
整形,为匹配到的最长子串长度
示例1
输入:
bab,caba
输出:
2