#include <bits/stdc++.h>
using namespace std;
int main()
{
string s1, s2;
cin >> s1;
cin >> s2;
int res = 0;
vector<vector<int>> dp(s1.size(), vector<int>(s2.size()));
for (int i = 0; i < s1.size(); i++)
{
for (int j = 0; j < s2.size(); j++)
{
if (s1[i] == s2[j])
{
if (i == 0 || j == 0)dp[i][j] = 1;
else dp[i][j] = 1 + dp[i - 1][j - 1];
}
else dp[i][j] = 0;
res = max(dp[i][j], res);
}
}
cout << res;
}
构建一个dp矩阵,通过dp来算得最长子串的长度。
dp[i][j]: 表示以s1[i]为结尾的子串和以s2[j]为结尾的子串的最长公共连续子串的长度
通过简单优化可降维成一维dp。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s1, s2;
cin >> s1;
cin >> s2;
int res = 0;
vector<int> dp(1000);
for (int i = 0; i < s1.size(); i++)
{
for (int j = s2.size(); j >= 0; j--)
{
if (s1[i] == s2[j])
{
dp[1 + j] = 1 + dp[j];
res = max(dp[1 + j], res);
}
else dp[1 + j] = 0;
}
}
cout << res;
}