#include <vector>
class Solution {
public:
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
string LCS(string str1, string str2) {
int n1 = str1.length(), n2 = str2.length();
int maxl = 0, maxstart = 0;
vector<vector<int> > dp(n1 + 1, vector<int>(n2 + 1));
for (int i = 1; i <= n1; ++i) {
for (int j = 1; j <= n2; ++j) {
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > maxl) {
maxstart = i - dp[i][j];
maxl = dp[i][j];
}
} else {
dp[i][j] = 0;
}
}
}
return str1.substr(maxstart, maxl);
}
};
思路:在求最长公共子串长度的基础上,记录一个最大长度。如果最大长度发生了更新,则更新对应长度以及此时的起始位置。
最后通过起始位置与长度,用substr方法找到最长字串。

京公网安备 11010502036488号