问题
给定两个字符串 s1 和 s2 ,求出一个最长的子串,使得该子串既是 s1 的子串,也是 s2 的子串。
样例
输入:
s1 = "ABC", s2 = "ABD"
输出:
2 ("AB")
解法
设dp[i][j]为以s1[i - 1]和s2[j - 1]为结尾的最长公共子串的长度。
对于和,即字符s1[i - 1]和字符s2[j - 1],
- 如果
s1[i - 1] == s2[j - 1]:
说明当前字符可以作为以s1[i - 1]和s2[j - 1]为结尾的最长公共子串的一部分。
则有:
同时记录当前当前公共子串是否是最长公共子串。 - 如果
s1[i - 1] != s2[j - 1]:
因为结尾不同,子串一定不同,所以:
综上有:
模版
int N, M;
int lcs(string s1, string s2)
{
int res = 0;
int dp[N][M];
int n = s1.size();
int m = s2.size();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(s1[i - 1] == s2[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] + 1;
res = std::max(ans, dp[i][j]);
}
return res;
}