题解 | #最长公共子串#
最长公共子串
https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac
动规:只要将当前的子序列最大长度记录在dp数组中即可,若是两者不相等,那么此时dp数组对应的值为零
class Solution {
public:
/**
* longest common subsequence
* @param s1 string字符串 the string
* @param s2 string字符串 the string
* @return string字符串
*/
string LCS(string s1, string s2) {
// write code here
//最长的公共子序列,初始化序列
vector<vector<int> > dp(s1.size() + 1, vector<int>(s2.size() + 1,0));
int res = 0;
int pos = 0;
for(int i = 1; i <= s1.size() ; i++)
{
for(int j = 1; j <= s2.size(); j++)
{
if(s1[i - 1] == s2[j - 1])
{
//怎么会呢,就差在后面的一个+1上面,只要确定斜对角是相等的即可
dp[i][j] = dp[i - 1][j - 1] + 1;
//这里面就需要对维护的最大值进行更新,以保障得到的用户一直处于最后的位子
if(res <= dp[i][j])
{
res = dp[i][j];
pos = i;//代表最后终止的地方
}
}
//不相等的话直接置零即可
else{
dp[i][j] = 0;
}
}
}
string r;
//截取当前子序列的值,然后处理即可
r.assign(s1.begin() + pos - res , s1.begin() + pos);
std::cout << r << " res = " << res << " pos = " << pos << std::endl;
if(r.size() == 0) return "-1";
return r;
}
};

