字串和子序列不同,一旦中间一个不等,其当前长度最长公共字串就要变为0.
同时记录下公共字串的最大值以及对应的字符串末尾下标。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
// 字串要求字符在源对象中连续,而序列只保证相对顺序不变
string LCS(string str1, string str2) {
if (str1.empty() || str2.empty()) {
return "";
}
int len1 = str1.size(), len2 = str2.size();
int max = 0, pos = 0;
std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1, 0));
for (int i = 0; i < len1; ++i) {
for (int j = 0; j < len2; ++j) {
dp[i + 1][j + 1] = str1[i] == str2[j] ? dp[i][j] + 1 : 0;
if (dp[i + 1][j + 1] > max) {
max = dp[i + 1][j + 1];
pos = i;
}
}
}
return str1.substr(pos - max + 1, max);
}
};